Android屏幕适配dp、px两套解决办法

2023-05-16

最新最全文章(2018-08-25):Android dp方式的屏幕适配-原理(后期补充完整讲解)_手机dp输出是横屏还是竖屏_android阿杜的博客-CSDN博客

“又是屏幕适配,这类文章网上不是很多了吗?”

我也很遗憾,确实又是老问题。但本文重点对网上的各种方案做一个简短的总结,和具体使用方法。

若想了解具体android设备适配的前世因果,请阅读hongyang文章:http://blog.csdn.net/lmj623565791/article/details/45460089

据我的总结,屏幕适配可以有两种方法适配,dp和px,一一讲解。

一、PX适配。

现在常用的屏幕尺寸为1280x720,一般美工也会根据这个尺寸给图。

图上标注的都是px,而android里面推荐使用的单位为dp。

相同的屏幕尺寸,不同的密度比例,可能会要用到不同的dp值。

这个转换很痛。

那么,省着点吧,对于1280x720的屏幕,我们若给宽度为720px是不是就占满屏幕了呢?对于1920x1080的屏幕,我们宽度给1080是不是就占满了你?

我们以1280x720为基准,把所有的宽度切成720份,高度切成1280份,其他的尺寸基于这个基准等比缩放。。。。。这么闹嗑真费劲,看图

 对于1280x720的屏幕,宽度给x720变量的值即占满屏幕。

万一用户的手机屏幕为800x480呢?看下图:

 

万一是1920x1080呢?看图:

 understand?根据不同的屏幕,x720变量会代表对应的px值,其他的变量也一样。dimens_y.xml文件也一样的等分了。

往下看  

 如上图,根据你的需要,生成需要适配的尺寸的文件,手机会根据屏幕相关参数自动寻找合适的尺寸文件的。需要执行生成适配文件夹时,找到screenMatchPX.bat文件所在的硬盘位置,双击执行该文件即可,即可在项目的res目录下生成对应的values-aaaxbbb文件夹和里面的文件数据。

screenMatchPX.jar里面的源码,文末我会提供的,jar文件的打包也没什么神秘的,去eclipse试试就知道了。

screenMatchPX.bat内容:

java -jar %~dp0\screenMatchPX.jar 720 1280
pause

也可以写成

java -jar 路径\screenMatchPX.jar 720 1280
pause

如果不了解批处理知识的,干脆别折腾了,直接用。但后面跟的参数要注意,看源码:

public static void main(String[] args) {
        System.out.println("开始运行...");
        //基准宽高
        int baseW = 720;
        int baseH = 1280;
        String addition = "";
        try {
            if (args.length == 1) {
                addition = args[0];
            } else if (args.length == 2) {
                baseW = Integer.parseInt(args[0]);
                baseH = Integer.parseInt(args[1]);
            } else if (args.length >= 3) {
                baseW = Integer.parseInt(args[0]);
                baseH = Integer.parseInt(args[1]);
                addition = args[2];
            } else {
                System.out.println("没有发现输入参数...");
            }
        } catch (NumberFormatException e) {
            System.err.println("right input params : java -jar xxx.jar baseW baseH w,h;w,h;...;w,h;");
            e.printStackTrace();
            System.exit(-1);
        }
        new GenerateValueFiles(baseW, baseH, addition).generate();
    }

默认基准值为,1280x720,

默认适配屏幕为

"320,480;480,800;480,854;540,888;600,1024;720,1184;720,1196;720,1280;768,1024;768,1280;800,1280;1080,1812;1080,1920;1440,2560;";

如果你觉得不合适就在参数行更改。

注意参数格式:

java -jar xxx.jar 基准width 基准height 待适配w,待适配h;待适配w,待适配h;待适配w,待适配h;

java -jar xxx.jar 基准width 基准height

java -jar xxx.jar 待适配w,待适配h;待适配w,待适配h;待适配w,待适配h;

搞定,会用这个bat批处理,生成对应的尺寸文件,在代码里面设置按钮的宽度为@dimens_x/x720 ,则在任何手机上都会是横向全屏的。

有一点坑,就是你需要获取待适配的手机的像素值,不要看网上的说明参数,需要看程序运行的参数值。

 我踩的坑:我的测试机联想A880,查阅屏幕参数为960x540,于是我加进去了。然后在程序中测试发现,失陪效果不好。

经过测试发现,它用的是800x480的尺寸文件。纠结很久发现程序能得到的屏幕尺寸其实为888x540,然后修改后重新生成values文件,才正常。

若你获取到的屏幕像素参数为 1283.45 x 724.89,那就取 1283x724,不要四舍五入了。

总结:

此方法,你需要做的是:

1、把screenMatchPX.bat和screenMatchPX.jar两个文件拷贝到你项目的main目录下;

2、修改screenMatchPX.bat文件中你需要适配的屏幕参数;

3、进到screenMatchPX.bat文件所在的硬盘位置,双击执行。执行是不要在AS里面双击,AS不可执行bat文件。

over

二、DP适配。

dp适配原理和上面px适配一样,只不过是拿dp值来等比缩放的而已。

无论手机屏幕的像素多少,密度比值多少,但80%的手机的dp值(widthPixels / density)都为360dp,所以对于这些手机,我们以360dp为基准,即只要写@dimen/dp_360即可让控件横向沾满屏幕。那万一有些手机的这个值是520dp怎么办呢?加进去生成对应的values即可了。

screenMatchDP.bat里面的代码为:

java -jar %~dp0\screenMatchDP.jar 360 384 400 411 533 640 720 768 820
pause

默认第一个为基准项,360dp。

后面跟的都是你需要适配的dp值,即某款手机的widthPixels / density比值。

如果你不跟参数,程序默认的参数为:

args = new String[]{"360", "384", "400", "411", "533", "640", "720", "768", "820"};

在程序的默认values文件夹中需要一份dimens.xml文件:

<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
	
    <dimen name="dp_m_60">-60dp</dimen>
    <dimen name="dp_m_30">-30dp</dimen>
    <dimen name="dp_m_20">-20dp</dimen>
	<dimen name="dp_m_10">-10dp</dimen>
    <dimen name="dp_m_5">-5dp</dimen>
    <dimen name="dp_0.1">0.1dp</dimen>
    <dimen name="dp_0.5">0.5dp</dimen>
    <dimen name="dp_1">1dp</dimen>
    <dimen name="dp_2">2dp</dimen>
    <dimen name="dp_2.5">2.5dp</dimen>
    <dimen name="dp_3">3dp</dimen>
    ...........
    <dimen name="dp_370">370dp</dimen>
    <dimen name="dp_402">402dp</dimen>
    <dimen name="dp_410">410dp</dimen>
    <dimen name="dp_422">422dp</dimen>
    <dimen name="dp_472">472dp</dimen>
    <dimen name="dp_500">500dp</dimen>
    <dimen name="dp_600">600dp</dimen>
    <dimen name="dp_640">640dp</dimen>
 
	<dimen name="sp_6">6sp</dimen>
    <dimen name="sp_7">7sp</dimen>
	<dimen name="sp_8">8sp</dimen>
    <dimen name="sp_9">9sp</dimen>
    <dimen name="sp_10">10sp</dimen>
    <dimen name="sp_11">11sp</dimen>
    ......
    <dimen name="sp_19">19sp</dimen>
    <dimen name="sp_20">20sp</dimen>
    <dimen name="sp_21">21sp</dimen>
	<dimen name="sp_22">22sp</dimen>
    <dimen name="sp_24">24sp</dimen>
    <dimen name="sp_28">28sp</dimen>
    <dimen name="sp_38">38sp</dimen>
    <dimen name="sp_40">40sp</dimen>
    <dimen name="sp_41">41sp</dimen>
    <dimen name="sp_48">48sp</dimen>
</resources>

需要负的dp,就写负数的item。有字体的适配。

程序里面会先读取上面的这个默认dimens.xml文件,然后根据需要适配的dp值生成对应的dimens.xml文件。

万一哪天你发现没有你想要的item,比喻888dp。那你就在默认的values中的dimens.xml中添加888dp,然后重新执行bat文件生成新的数据即可。你想要的dp值,在values中的dimens.xml中添加就行!!!!!!!!!!!

美工给图的时候最好是1280x720的图,这样的话,拿到宽度的值直接除以2,代码里面写成@dimen/dp_360即可。方便计算。

总结:

此方法,你需要做的是:

1、默认的values文件夹中需要一份特定的dimens.xml文件。文末提供下载

2、把screenMatchDP.bat和screenMatchDP.jar两个文件拷贝到你项目的main目录下;

3、修改screenMatchDP.bat文件中你需要适配的屏幕dp参数;

4、进到screenMatchDP.bat文件所在的硬盘位置,双击执行。执行是不要在AS里面双击,AS不可执行bat文件。

OVER

源码图:

 dp目录是dp方式适配的源代码。

px目录是hongyang提供的px适配源代码。

MainActivity类中有获取屏幕参数和dp参数的代码。

根据你的需要,自己修改和定制程序吧。

阿杜提供,放心盗版。

以上两种方法大概原理和使用方法都介绍完了,你可以实验。dp的方法我们已经应用到项目中了,没问题。px的方式只是测试过,没有应用。

dp方法的缺点:如果没有默认的dimens.xml,那就黄昏依斜阳了,还好有提供。优点是,没有枚举全部的item,可以省一些apk空间;有字体sp的适配。

px方法的缺点:屏幕px的种类远多于dp的种类,文件数量多;程序for循环枚举item项,有部分用不上的px项;width和height都适配了,给控件写width尺寸时要用dimens_x.xml里面的变量值,写height尺寸时需要用dimens_y.xml里面的变量值。

GitHub上提供更新jar和源码

GitHub源码地址:GitHub - mengzhinan/PhoneScreenMatch: 屏幕适配方案

CSDN下载地址:http://download.csdn.net/detail/fesdgasdgasdg/9613054

详细使用说明文档地址:http://download.csdn.net/detail/fesdgasdgasdg/9913744

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android屏幕适配dp、px两套解决办法 的相关文章

  • windows下使用cmake编译zlib与libpng 留此备份

    首先准备工具 cmake http www cmake org cmake resources software html zlib http www zlib net libpng http www libpng org pub png
  • opengl下png图片的加载与显示

    首先说明 部分代码来自http www cnblogs com IamEasy Man archive 2009 12 14 1624023 html 至于里面的源地址什么的我不管 然后吐槽 xff0c 国内的资料各种坑爹 xff0c 竟没
  • opengl透明mask图片做蒙版效果的实现

    hello xff0c 朋友们 xff0c 我又来了 xff0c 还记得上篇文章提到的事情否 xff1f 没错 xff0c 加载png只是第一步 xff0c 接下来要实现用mask图扣掉png中不需要的部分 xff08 也就是cocos2d
  • Unity3d 5.3.5使用sqlite3

    国内讲的乱七八糟 xff0c 更有故作神秘提供Mono Data Sqlite dll System Data dll的 xff0c 就是不告诉你这两文件在哪里 我很无语 看国外的 xff0c 多靠谱 http answers unity3
  • Zabbix 监控主机是否在线

    最近有点忙 xff0c 很久没有更新博客了 今天这篇文章主要记录如何通过zabbix监控一台主机是否在线 好啦开干 1 新建一个模板 新建模板的目的是在新模板上添加 监控项 和 触发器 的 xff0c 如果你要监控的主机数量非常少的话 xf
  • VSCODE 使用SSH远程连接(Windows10)

    开启Windows10的SSH功能 点击开始菜单 gt 设置 gt 应用 gt 应用和功能 gt 可选功能 gt 添加功能 xff1b 添加OpenSSH 客户端 和 OpenSSH 服务器 然后cmd 输入ssh xff0c 一般会出现下
  • Jetson NX emmc版本系统转移到SSD

    因emmc版本的NX自带内存不够大 xff0c 只有16GB xff08 手上的是这个型号 xff09 xff0c 安装系统大概需要除去4G多内存 xff0c 再安装CUDA cuDNN TensorRT等内存直接爆满 无法继续使用 所以需
  • unix 修改文件类型

    Unix及类Unix系统里 xff0c 每行结尾只有换行 n xff1b Windows系统里面 xff0c 每行结尾是换行 43 回车 n r 第一种 xff1a 利用Linux下的vim编辑器 xff0c 可以方便的在dos文件 uni
  • DIR=$(cd `dirname $0`; pwd)

    dirname 0 xff0c 获取当前脚本所在绝对目录 cd 96 dirname 0 96 xff0c 进入这个目录 xff08 切换当前工作目录 xff09 pwd xff0c 显示切换后脚本所在的工作目录 echo xff0c 打印
  • ulimit命令的使用

    ulimint a 用来显示当前的各种用户进程限制 Linux对于每个用户 xff0c 系统限制其最大进程数 xff0c 为提高性能 xff0c 可以根据设备资源情况 xff0c 设置个Linux用户的最大进程数 xff0c 一些需要设置为
  • error while loading shared libraries: libavformat.so.58: cannot open shared object file: 解决

    sutpc icvtsn dfa error while loading shared libraries libavformat so 58 cannot open shared object file No such file or d
  • Git 检测不到文件目录下的文件变化信息

    Git在上传代码的时候发现有的只能检测出某个目录 xff0c 然而检测不到那个目录下的C文件和h文件 并且git 提交之后 xff0c 在git上某个文件有后缀 64 b4c4u7之类的 这种文件没办法点击 没办法查看 xff0c 根本无法
  • Linux 搭建MQTT服务器并使用

    环境 xff1a ubuntu 18 04 1 安装必备软件 span style background color f6f6f6 span style color 121212 yum install gcc c 43 43 cmake
  • 批量ping多个IP地址

    for L D in 90 1 95 do ping 10 10 70 D gt gt ping log 代码的意思如下 xff1a 代码中的这个 90 1 95 就是网段起与始 xff0c 就是检测网段10 10 70 90到10 10
  • Linux驱动开发一

    一 开发模块框架 1 xff09 编写源代码 include lt linux init h gt include lt linux module h gt 加载函数 static int init hello init void prin
  • ”此网站尚未经过身份验证“问题的解决办法

    在使用 https 访问我的路由器时出现无法访问的现象 xff0c 下图是浏览器的告警信息 xff0c 目前通过百度 此网站尚未经过身份验证 并没有找到解决方案 而我的另一台笔记本电脑却可以通过 https 打开路由器的配置管理页面 xff
  • linux的yum更新方式update和upgrade

    Linux升级命令有两个分别是yum upgrade和yum update 这个两个命令是有区别的 代码如下 yum y update 升级所有包同时也升级软件和系统内核 代码如下 yum y upgrade 只升级所有包 xff0c 不升
  • Linux驱动开发二

    2 xff09 创建设备节点 gt 手动创建设备节点 mknod 设备名 设备类型 主设备号 次设备号 mknod dev hello c 254 0 gt 自动创建设备节点 创建类 class create owner name 参数1
  • SO_BINDTODEVICE 使用

    就绑定到了接口 34 lmi40 34 上 所有数据报的收发都只经过这个网卡 对于SOL BINDTODEVICE的总结如下 xff08 1 xff09 对于TCP套接口 UDP套接口 RAW套接口 xff0c 可以通过SO BINDTOD
  • json交叉编译并移植到嵌入式开发板

    1 解压 xff1a tar xvf json c 0 9 tar gz 默认解压在当前目录 2 进入解压后的目录 xff1a cd cd json c 0 9 3 执行 xff1a sudo configure CC 61 aarch64

随机推荐

  • strftime()函数的使用方法

    strftime strftime是C语言标准库中用来格式化输出时间的的函数 Ubuntu自带的manual手册说法如下 xff0c 截图没有截全 xff0c 需要更详细信息的自行查看相关的内容 下面是strftime的用法 示例代码如下
  • tcpdump 抓包

    一 Tcpdump抓包 抓取端口为2008的数据包 抓包文件内容 抓取到的内容保存在文件中 xff0c 可以通过wireshark分析 二 tcpdump的一些命令 tcpdump和ethereal可以用来获取和分析网络通讯活动 xff0c
  • wireshark抓包工具的使用

    前言 wireshark是非常流行的网络封包分析软件 xff0c 功能十分强大 可以截取各种网络封包 xff0c 显示网络封包的详细信息 使用wireshark的人必须了解网络协议 xff0c 否则就看不懂wireshark 为了安全考虑
  • Docker 在Ubuntu的安装

    系统要求 Docker 支持以下版本的 Ubuntu 操作系统 xff1a Ubuntu Hirsute 21 04Ubuntu Groovy 20 10Ubuntu Focal 20 04 LTS Ubuntu Bionic 18 04
  • Notepad++ 如何筛选内容

    在程序调试的过程中 xff0c 通常会通过抓取日志来分析 xff0c 但实际情况抓取的日志会很多 xff0c 如何在众多的日志中筛选出自己想要的内容呢 xff0c 我们可以通过notepad打开日志 xff0c 然后进行筛选 1 通过ctr
  • Jetson Nano emmc版本系统镜像备份和烧录

    一 镜像备份 1 xff0e 将待复制的jetson设备进入恢复模式 xff0c 用数据线连接jetson设备和主机 对于原厂开发板将FC REC引脚与GND短接 xff0c 通过micro usb到usb数据线连接到电脑 在电脑的ubun
  • Ubuntu系统永久挂载硬盘、U盘等存储设备

    在日常开发工作中 xff0c 经常会遇见需要借助外接存储设备来存放一些数据的情况 xff0c 于是我们会使用如下命令来挂载 xff1a sudo mount dev sda2 mnt 这样挂载的弊端就是设备掉电之后 xff0c 之前挂载的设
  • ubuntu20.04 + kiosk + chrome打造一体机系统

    kiosk 的英文直译为凉亭 公用电话亭 报摊或者一体机的意思 目前主流的浏览器都具有kiosk模式 我们可以使用浏览器的kiosk模式加ubuntu操作系统在不增加任何软件的情况将我们的B S程序打造成一个一体机系统 1 前置条件 ubu
  • Ubuntu 增加swap交换内存

    一 创建虚拟内存 在实际开发中发现swap交换分区不够用了 xff0c 于是需要创建虚拟内存来增加交换分区的大小 在系统空闲空间位置创建swap虚拟内存专用文件夹 cd data 切到你想要创建交换分区的目录 mkdir swap 新建文件
  • 闲扯原码,补码和反码

    闲扯原码 xff0c 补码和反码 始发于 goal00001111 的专栏 xff1b 允许自由转载 xff0c 但必须注明作者和出处 人类习惯使用十进制数进行数值计算 xff0c 而计算机则采用二进制 xff0c 所以为了让计算机帮助人类
  • switch 无法启动软件,请在HOME菜单中再试一次

    本人的是11 0 1 0 18 1 xff0c 刚升级完成后所有游戏都提示 xff1a 无法启动软件 xff0c 请在HOME菜单中再试一次 xff1b 然后搜索一番之后亲测有效 1将如下资源下载到本地 xff0c 2解压后放到对应的文件夹
  • switch如何更新大气层,和进入hekate界面

    0 xff0c 使用windows xff0c 使用windows xff0c 使用windoes xff01 1 xff0c 下载hekate最新版 xff0c 下载最新版大气层固件 xff0c 替换掉SD卡对应地方的文件即可 xff0c
  • RxJava简单入门

    前言之前 span style color fe2c24 首先来认识一下接下来我们将要接触的关键单词 xff0c Observeable Observer subscrib国内基本都翻译成 xff0c 被观察者 xff0c 观察者 xff0
  • WebView加载网页出错:ERR_UNKNOWN_URL_SCHEME

    一 原因 因为webview只能识别http https这样的协议 xff0c 像一些微信 weixin 去哪儿 qunaraphone xff0c 他们自定义的协议webView是无法识别的 xff0c 因此就会出现 xff1a ERR
  • ESP32-CAM搭建Arduino及简单使用

    准备 需要一个ESP32 CAM模块 xff0c 我买的是这种 xff0c 下面带了个下载模块的 xff0c 接上USB就能用了 xff0c 很方便 xff0c 如果没有买下面那个那就得自行用USB TTL了 配置环境 有了硬件 xff0c
  • Failed resolution of: Landroidx/databinding/DataBinderMapperImpl;

    报错 xff1a Failed resolution of Landroidx databinding DataBinderMapperImpl 原因 xff1a lib工程gradle文件中加了dataBinding xff0c 且能使用
  • 谷歌浏览器调试工具使用基础版(一)

    知识采集出处 一 先来认识一下这些按钮 先来看这张图最上头的一行是一个功能菜单 xff0c 每一个菜单都有它相应的功能和使用方法 xff0c 依次从左往右来看 1 箭头按钮 xff1a 用于在页面选择一个元素来审查和查看它的相关信息 xff
  • Android studio 按ctrl+v变成insert的解决办法

    Android studio 按ctrl 43 v变成insert的解决办法 Mac版 android studio 竖线的光标突然变成了矩形 解决方法 xff1a File Settings Editor General Apperanc
  • Windows Server2012多远程桌面配置

    一 配置相关信息 1 win 43 R 输入gpedit msc 计算机配置 管理模板 windows组件 远程桌面服务 远程桌面会话主机 连接 2 将远程桌面服务限制到单独的远程桌面会话禁用 3 启用拒绝将已登录到控制台的管理员注销 不启
  • Android屏幕适配dp、px两套解决办法

    最新最全文章 2018 08 25 xff1a Android dp方式的屏幕适配 原理 后期补充完整讲解 手机dp输出是横屏还是竖屏 android阿杜的博客 CSDN博客 又是屏幕适配 xff0c 这类文章网上不是很多了吗 xff1f