当我们要在Layout 中定义控件的长宽等维度时,Android的推荐是:

1)所有长宽的单位都定义成dip,除了字体的大小

2)字体的大小用sp来表示

这篇文章我们讨论一下,为什么不用像素 px, 而要用dip 表示呢? dip 跟 px 之前的关系是什么呢?

实践出真知,代码来展示。

我们先来定义两个按钮,其中一个的宽度是160 dip, 另外一个的宽度是160 px,(注意单位不同)然后来看看在不同的模拟器上有什么不一样。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextView android:id="@+id/textViewSw"android:layout_width="320dip"android:layout_height="wrap_content"android:background="#00CC77"/><Button android:layout_width="160dip"android:layout_height="wrap_content"android:text="160dip">       </Button><Button android:layout_width="160px"android:layout_height="wrap_content"android:text="160px">       </Button><TextView android:id="@+id/textViewDp"android:layout_width="160dip"android:layout_height="wrap_content"android:background="#00CC77"/><TextView android:id="@+id/textViewPx"android:layout_width="160dip"android:layout_height="wrap_content"android:background="#00CC77"/></LinearLayout>

同时也定义了几个TextView, 来展示屏幕的宽度,屏幕密度比例 和 屏幕的密度。

public class DipActivity extends Activity{public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);DisplayMetrics displayMetrics = getResources().getDisplayMetrics();float density = displayMetrics.density;int densityDpi = displayMetrics.densityDpi;int screenWidth = displayMetrics.widthPixels;setContentView(R.layout.dip_layout);TextView textViewSw = (TextView)findViewById(R.id.textViewSw);textViewSw.setText("screen Width (px):" + screenWidth);TextView dpView = (TextView)findViewById(R.id.textViewDp);dpView.setText("Density :" + density);TextView pxView = (TextView)findViewById(R.id.textViewPx);pxView.setText("Density Dpi : " + String.valueOf(densityDpi));}
}

然后我们运行代码,看看效果怎么样?如下,上面的是在480*800的模拟器上,下面是在320*480的模拟器上。

我们先来看屏幕为480*800的机器,

Button的宽度为160dip的很明显要比160px的要长,事实上,160dip的按钮占据了一半的宽度(240px),而160px的Button,就是160px.

为什么会这样呢?其实就是跟图上展示的Density有关了,我把它称为密度比例,它的值是当前屏幕的dpi (Dot Per Inch,不是dip)跟 160 的一个比例。

在屏幕密度 Density dpi 为240的手机上,密度比例Density = 240 / 160 = 1.5.

而dip 跟 px 的之间的比例 则为 px = dip * 1.5, 即当我们在布局中设置按钮的宽为160dip时,当它经过系统的换算,展现在屏幕上的已经是像素,而其值就是160 * 1.5 = 240px.

在Android手机中,一般有下面4个级别的屏幕密度,

1)120 - Low 对应的density = 120 / 160 = 0.75

2)160 - Medium 对应的density = 160 / 160 = 1.0

3)240 - High 对应的density = 240 / 160 = 1.5

4)320 - Extra High 对应的density = 320 / 160 =2.0

这个值可以通过DisplayMetrics来拿到,如下:

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
float density = displayMetrics.density;
int densityDpi = displayMetrics.densityDpi;
int screenWidth = displayMetrics.widthPixels;

当我们在布局中以dip为单位的时候,中间其实会经过系统的换算,根据不同的屏幕密度,将其转换成对应屏幕的像素,从而达到适应不同屏幕分辨率的问题。

在320*480的机器上,可以看到Density Dpi = 160, 那么其Density = 160/160 = 1.0, 那么160dip 转换成像素就是 160 * 1.0 = 160px.

所以160dip的按钮跟160px的按钮在屏幕上展现是一样宽的。

综合两个图来看,当我们定义160dip的时候,无论是在上边的机器还是下边的机器,按钮都是占据屏幕的一半宽度,而如果定义成160px的话,则达不到这样的效果。

我想这也就是为什么Android会推荐用dip而不推荐px了,因为不同分辨率的手机屏幕实在是太多了,用像素的话,定死了,真不好看。

而用dip,则系统会去读取屏幕的密度,再根据密度比例来计算真正要展现在屏幕上的像素,效果会好很多。

Android中 dip 和 px 的关系相关推荐

  1. android中dp和px的关系

    关于android的dp和px的关系是我刚开始学习android的第一个知识点,不知不觉学安卓也有一年了,但是偶然间我发现我理解的dp和px的关系一直是错的,真的是有一点搞笑,今天特意写一篇博客纪念一 ...

  2. Android中dp与px互转的方法

    在Android中dp和px互转的工具类,直接调用即可 public class ScaleUtils { //dp转pxpublic static int dip2px(Context contex ...

  3. android中dip、dp、px、sp和屏幕密度

    1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这    这个 ...

  4. android中ADT和SDK的关系(转)

    ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升 ...

  5. Android中dip和sp的真正区别

    估计很少有人知道Android里面dip和sp的真正区别,无论你在网上怎么搜,搜出来的结果都是告诉你字体用sp,尺寸用dip . 可是为什么字体用sp呢?谷歌为什么要这么定呢?这两个单位之间到底有什么 ...

  6. Android中dip、dp、sp、pt和px的区别

    1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小.在有些情况 ...

  7. Android中ADT和SDK的关系

    Android平台与SDK Tools版本.ADT版本的对应关系 Android平台          SDK Tools的版本                      ADT版本 Android  ...

  8. android中进程和线程的关系与区别

    什么是进程什么是线程 进程是指在系统中正在运行的一个应用程序:程序一旦运行就是进程 进程可以认为是程序执行时的一个实例.进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间.一个进程无法直 ...

  9. 【转】Android中dp,px,sp概念梳理以及如何做到屏幕适配

    2019独角兽企业重金招聘Python工程师标准>>> 首先来看一下他们的基本概念: px   :是屏幕的像素点 dp   :一个基于density的抽象单位,如果一个160dpi的 ...

  10. [转]Android中dp,px,sp概念梳理以及如何做到屏幕适配

    http://blog.csdn.net/jiangwei0910410003/article/details/40509571 今天又开始我的App开发,因为之前一直做的是SDK,所以涉及到界面UI ...

最新文章

  1. 【摄像头】摄像头相关名词解释
  2. 后端必备 Git 分支开发:规范指南
  3. 沈向、洋周明:神经自然语言处理进展综述:建模,学习,推理
  4. AI学会了用“人眼”看世界,甚至连人类瞳孔的细微缩放都能模拟 | 杜克大学...
  5. 关于Reporting Service中的Report builder的几个疑问,高手来解答下
  6. python之微信好友统计信息
  7. 跨工厂物料状态/特定工厂的物料状态
  8. Sending HTML content in an email using PHP
  9. 产品经理有话说!这个报表神器更新了6大功能,绝对亮眼
  10. python 元组和列表区别_Python基础教程,第三讲,列表和元组
  11. 高通似乎成了台积电和三星在先进工艺上暗战主角
  12. 给全栈人员,如何用ps让图片不改变尺寸分辨率大小的情况下,让图片质量变的更小
  13. Python中的盆地跳跃(Basin Hopping)优化
  14. layui table数据表格中数据返回成功,但页面不显示数据内容问题
  15. 《沈剑架构师训练营》第7章 - 架构解耦
  16. long到int、int到long的强制类型转换的汇编代码
  17. 迈瑞医疗招聘-软件测试工程师
  18. 关于java返回值对象BO设置初始值的问题
  19. Android 主题切换/换肤方案 研究(四) - qq和qq空间
  20. 《毛毛虫团队》第四次作业:基于原型的团队项目需求调研与分析

热门文章

  1. UMLChina公众号文章精选(20220330更新精选)
  2. javaScript中this以及window对象和window对象的name属性
  3. canvas绘制五角星
  4. 桌面计算机文件夹图标没了,电脑文件夹图标不见了怎么办
  5. 我是如何学习一门新技术的
  6. 基于Java Swing五子棋小游戏设计和实现
  7. 考研没过线也能录取?13种特殊录取方式!
  8. spring aop 和Transaction一起使用执行顺序问题
  9. u盘显示请插磁盘f_U盘插电脑上一直显示请插入磁盘是啥意思 - 卡饭网
  10. pdf旋转后如何保存?操作工具有这些