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

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

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

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

density是设备密度,有了设备密度,咱们才能够将px转为dp。api

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

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

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

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

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

当你已经不纠结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) {
    //像素值除以density
    String 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());

运行结果:

<?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>
……

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

<ImageView
    android:layout_width="@dimen/px100dp"
    android:layout_height="@dimen/px100dp" />

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

^_^

——END——