转自http://blog.csdn.net/zengd0/article/details/52464627

一款优秀app的产生,往往需要有一套精美华丽的UI设计图,诚然,UI仅仅只是个开始,有追求极致的前端工程师开发软件时尽可能地去贴近UI的设计才是重中之重。

我们知道,Android的尺寸单位一般采用dp或者sp,然而有时候我们遇到的UI设计图给的尺寸标注却是px的,这显然是给iOS画的UI。安卓设备的多样性决定了我们绝对不能将控件的尺寸大小直接设置为UI图上的px值。那该如何解决呢?愤愤不平地去找UI工程师出一套安卓的标注?条件允许的话你当然可以这样干,但其实我们还有另外一种快准不知道狠不狠的解决方案:px转dp。

比较关注原理的童鞋会知道,px转dp的公式:dp = px/density

density是设备密度,有了设备密度,我们才可以将px转为dp。

这时候你可能会想,Android系统不是提供了api供我们转换吗,或者Android系统获取设备密度:context.getResources().getDisplayMetrics().density,然后将UI图的px去除以desity?

非也。density值是获取了,但是请问UI图上的px值是按照你的手机来标注的吗?如果UI图是以iPhone6手机(4.7寸屏幕,分辨率1334*750)为基准进行设计的,那么你用这个px值去除以你自己安卓手机的设备密度,怎么可能对。也就是说,我们要获取UI图的设备密度(density)。

设备密度公式:density = PPI/160。

PPI是像素密度,公式:PPI = √(长度像素数² + 宽度像素数²) / 屏幕尺寸

不要晕,多看几遍,多思考,你就会明白这几个公式间的转换关系。PPI的公式不难理解,就是指每英寸屏幕有多少个像素点。比如iPhone6的PPI是326,1英寸屏幕有326个像素点。至于设备密度这个公式,PPI除以160,为什么是160而不是别的,这个不用太过于纠结。160是谷歌推荐的数值,这样转换为hdpi、xhdpi等的数值就比较妥当。

当你已经不纠结160的时候,我来带你一步步实现尺寸适配方案:

  1. 获取分辨率。拿到UI图片文件,鼠标右键属性,点击详细信息选项卡,即可获知图片的分辨率。(分辨率是多少也可以问UI工程师……)
  2. 获取屏幕尺寸。问UI工程师,问ta是以哪个尺寸为基准进行画图的。也有个神器叫PxCook能识别出UI图的设备型号基准,然后通过设备型号搜索出该设备是几寸屏。。如果UI去火星了并且PxCook也江郎才尽了,那就此打住吧。
  3. 运行代码,批量转化px为dp。将你得到的尺寸分辨率,代入相应的变量,运行下面的代码:
int width = 750;//屏幕宽度
int height = 1334;//屏幕高度
float screenInch = 4.7f;//屏幕尺寸
//设备密度公式
float density = (float) Math.sqrt(width * width + height * height) / screenInch / 160;StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n");
for (int px = 0; px <= 1000; px += 2) {//像素值除以densityString dp = px * 1.0f / density + "";//拼接成资源文件的内容,方便引用if (dp.indexOf(".") + 4 < dp.length()) {//保留3位小数dp = dp.substring(0, dp.indexOf(".") + 4);}stringBuilder.append("<dimen name=\"px").append(px + "").append("dp\">").append(dp).append("dp</dimen>\n");
}
stringBuilder.append("</resources>");
System.out.println(stringBuilder.toString());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

运行结果:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="px0dp">0.0dp</dimen>
<dimen name="px2dp">0.982dp</dimen>
<dimen name="px4dp">1.965dp</dimen>
<dimen name="px6dp">2.948dp</dimen>
<dimen name="px8dp">3.931dp</dimen>
<dimen name="px10dp">4.913dp</dimen>
<dimen name="px12dp">5.896dp</dimen>
……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

你也可以将拼接后的字符串,输出到文件流。 
4. 在你的安卓项目中,values文件夹,新建名为dimens_px.xml文件,将控制台输出的内容全选复制粘贴到xml里。 
5. 引用dimens尺寸文件值。如下面的使用demo:

 <ImageViewandroid:layout_width="@dimen/px100dp"android:layout_height="@dimen/px100dp" />
  • 1
  • 2
  • 3

TextView要用sp怎么办?同理,步骤3的拼接代码将append(dp)改为append(sp),然后在安卓项目中新建多一个sp值的dimens资源文件咯。

^_^

安卓UI图px标注适配攻略:批量转化px为dp相关推荐

  1. Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸

    Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸 在安卓中,将屏幕密度分为了五类 屏幕密度 对应的标签 对应的像素 120dip ldpi 1dp= 0.75px 160dip mdp ...

  2. Android 屏幕适配攻略(三)单位dp与sp

    Android 屏幕适配攻略(三)单位dp与sp 1 一般手机默认使用情况下 在安卓中,一般情况下,也就是正常使用情况下 屏幕密度 对应的标签 对应的像素 sp 120dip ldpi 1dp= 0. ...

  3. Android 屏幕适配攻略(四)获取手机屏幕的相关信息 与动态设置控件的大小

    Android 屏幕适配攻略(四)获取手机屏幕的相关信息 与动态设置控件的大小 1 动态获取手机屏幕的 屏幕密度与对应像素比例 例如在 320 * 480 尺寸为 3.2 英寸的手机 ,对应的像素密度 ...

  4. Android 屏幕适配攻略(一)

    Android 屏幕适配攻略(一) 1 常用的单位概述 px pixels(像素) 表示屏幕实际的象素.例如,320 x 480 (也就是生活中常说的屏幕分辨率为320x480)的屏幕在横向有320个 ...

  5. Android Q适配攻略(一)(图标适配)

    Android Q之提前适配攻略(一)(图标适配) Android Q之提前适配攻略(二)(后台定位适配) Android Q之提前适配攻略(三)(唯一标识符更改) Android Q之提前适配攻略( ...

  6. Android 屏幕适配攻略(六)设置通知样图标与启动图标适配

    Android 屏幕适配攻略(六)设置通知样图标与启动图标适配 1 Android中资源文件中的图片加载分析 Android中对屏幕的像素适配处理分类 屏幕密度 对应的标签 对应的像素 120dip ...

  7. Android 动态创建控件并设置控件的大小之Android屏幕适配攻略(五)

    Android 屏幕适配攻略(五)动态创建控件并设置控件的大小 题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 flutter中网络请求dio使用分析 视频 ...

  8. Android 11 变更及适配攻略

    终于开始了Android 11的适配工作.记录一下,供需要的人参考. 1. 准备工作 老规矩,首先将我们项目中的 targetSdkVersion 改为 30.或者使用兼容性调试工具,后面我会说到. ...

  9. Android Q适配攻略(四)(后台Activity启动限制)

    Android Q之提前适配攻略(一)(图标适配) Android Q之提前适配攻略(二)(后台定位适配) Android Q之提前适配攻略(三)(唯一标识符更改) Android Q之提前适配攻略( ...

最新文章

  1. 【AS3代码】访问/修改XML子元素和属性
  2. Centos7安装mariadb galera cluster数据库集群 详解
  3. day14 集合与函数
  4. Java NIO学习系列七:Path、Files、AsynchronousFileChannel
  5. 使用USMT备份和还原用户数据
  6. js中的墙头草---this
  7. java的serversocket_Java ServerSocket 实现聊天室功能(简易版)
  8. GitHub建立个人网站(三)
  9. 解决RichEdit line insertion error的方法(转载)
  10. Atitit 并发技术的选项 attilax总结 艾龙 著 1. 三大并发模型 1 2. 从可读性考虑 优先使用 并行工作者 多线程模式,不要使用异步流水线模式 2 2.1. 多线程模式方便全局
  11. 【Windows】添加开机启动项
  12. 电脑数据误删除了怎么恢复?误删除数据恢复操作教程
  13. Java 定义一个 Employee类,定义方法输出Employee的名字,年龄,总收入。编写应用程序使用Employee
  14. webrtc QOS方法十二(接收端IDR帧请求)
  15. python 群发邮件数量限制_qq邮箱群发邮件的数量和速度限制是多少?
  16. HTML5知识点总结(五)
  17. 不要虚荣心太强,要踏实肯干
  18. python获取字符串首字母_Python中用startswith()函数判断字符串开头的教程
  19. VMware安装安卓模拟器
  20. python客户端开发自行车租赁系统_Python实战—自行车租赁数据分析

热门文章

  1. python发朋友圈突破朋友圈限制_突破限制!原来朋友圈可以发长达5分钟的视频,后悔没早点知道...
  2. 这几个万里挑一的良心App,个顶个好用,保证一用就再舍不得删
  3. go 注册登录 mysql_golang后台 实现用户登录注册
  4. windows ios良心软件推荐
  5. CAD软件中如何统一文字字高?
  6. 电脑问题处理篇4:解决华硕电脑“ASUS Battery Health Charging”软件界面呈现灰色不能选择充电模式的问题
  7. vue文件夹上传组件选哪个好?
  8. 中国古代四大名著电子书(android)
  9. html瞄点四大名著有图片,四大名著手抄报图片图和文字资料
  10. Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'解决方案