一款优秀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>");Log.e("tag",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:

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

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

android 关于px转化为dp,sp相关推荐

  1. px(像素)与 dp, sp换算公式

    PPI = Pixels per inch,每英寸上的像素数,即 "像素密度" xhdpi: 2.0 hdpi: 1.5 mdpi: 1.0 (baseline) ldpi: 0. ...

  2. Android之px 与 dp, sp换算公式

    px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多. pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用 ...

  3. android 字体像素转换工具类_Android中px与dip,sp与dip等的转换工具类

    Android中px与dip,sp与dip等的转换工具类 功能 通常在代码中设置组件或文字大小只能用px,通过这个工具类我们可以把dip(dp)或sp为单位的值转换为以px为单位的值而保证大小不变.方 ...

  4. Android px、dip、sp

    Android的px.dip.sp的区别 一.       概述 我们在页面布局的时候,经常会设置容器的长度,但是到底该使用哪个作为长度的单位而懊恼. 在Android中支持的描述大小区域的类型有以下 ...

  5. Android的px、dp和sp

    Android的px.dp和sp px: 即像素,1px代表屏幕上一个物理的像素点:偶尔用到px的情况,是需要画1像素表格线或阴影线的时候. dp: 这个是最常用但也最难理解的尺寸单位.它与" ...

  6. android 字体像素转换工具类_android px,dp,sp大小转换工具

    package com.voole.playerlib.util; import android.content.Context; /** * Android大小单位转换工具类 * * float s ...

  7. android 字体px转sp,Android中px,dp,sp区别及换算

    px,dp,sp是Android中常用的距离单位. 基本概念: 屏幕尺寸:指的是屏幕对角线长度,用英寸(in)作为单位,1 in = 2.54 cm. 屏幕分辨率:在横纵向上的像素点数,单位px.一般 ...

  8. android 尺寸转换 dp sp in mm pt px转换为int

    在android开发中,在自定义view中有些函数只接受int参数,而我们经常使用的尺寸单位是dp.sp这些,那如何将它们转换为int型呢? int spToInt=TypedValue.applyD ...

  9. android中像素单位dp、px、pt、sp转换

    android中像素单位有dp.px.pt.sp,每一种都代表不同的尺寸,先说一下每一种尺寸单位的含义. dp(dip): device independent pixels(设备独立像素). 不同设 ...

最新文章

  1. Android依赖注入的实践——Dagger2
  2. linux a文本编辑大全,Linux sed 命令 - Linux文档编辑命令大全
  3. 如何用MLflow做机器学习实验效果比对
  4. AVA 8 :从永久区(PermGen)到元空间(Metaspace)
  5. github的webhooks无法刷新config服务端的bus-refresh接口
  6. 第二阶段—个人工作总结08
  7. 电脑下边的任务栏不见了_正确的Windows任务栏设置,为你的操作带来便利,一起学习...
  8. java编程能做什么_学习Java编程能做什么工作?
  9. 表单和iframe的使用
  10. 5-2利用MapReduce进行数据排序
  11. 解析域名地址并生成win路由增强版
  12. 【深扒】深入理解 JavaScript 中的异步编程
  13. t470键盘拆解_做工保持良好水准 ThinkPad T470笔记本拆机解析
  14. EEGLAB初步学习(1)
  15. 死链接检测 java,【死链接检测】工具查询方法及死链接处理方法
  16. 破解隔壁wifi的实践——网络攻击,抓取握手包,解包
  17. 屏幕录像专家录制超清视频教程-王西猛-专题视频课程
  18. u盘如何在计算机应用内存,详解为什么8G内存U盘在电脑上显示不到8G只有7.5G
  19. 2022-2023年度的AMC数学竞赛报名时间来了
  20. 前端开发入门 --摘自慕克网大漠穷秋

热门文章

  1. 计算机无法打开这个应用,win10照片应用打不开提示“无法打开这应用”如何解决...
  2. 三大运营商的网上流量卡数据对比,看看你会选哪一个?
  3. HTTPS双向认证+USB硬件加密锁(加密狗)配置
  4. 计算机硬件介绍之CPU与多线程
  5. burpsuite实现抓Windows for Android(WSA)包
  6. kinect for Unity开发
  7. 用JS实现猜数字游戏
  8. 用狼的处世哲学做SOHO(一)
  9. java我的世界非正常退出_我的世界非正常退出怎么办???
  10. 使用二手书App的心得