Android中px和dip的区别

Android中px和dip的区别

      在Android手机的诞生之初,由于Android系统是开源的,一开始便有众多的OEM厂商对Android手机进行深度定制,于是乎Android手机的皮肤和屏幕大小都变得百花齐放,这可苦逼了我们这群开发者,因为我们被要求要注意写出一个好的Android软件,写一次代码就能适应大小不同的屏幕。这就好比,你做了一套衣服,要让不同身材的人都穿得合身,类似于生活中的道理,我们这套衣服肯定不能用没有弹性的布料,所以我们要像生活中那种无尺码,有弹性的衣服学习,在代码里面尽量让界面能够自动适应屏幕的大小,幸好Android操作系统提供了一些这方面的屏幕适应机制。

       屏幕上的图案最终就是由一个个的点构成的,也就是说我们最终要控制的就是怎么合理地拉伸屏幕上的点,以便让界面合理地铺到界面上,好像专门为了用户手中的这块屏幕开发的一样,android中的界面显示单位主要有px,dp(dip),sp等,下面我们将简单地介绍它们并提出在什么场合使用。

几乎是一条定律:

除了sp和dp,不要使用别的单位,除非你没有办法不那么做。使用sp/dp会让你的Android应用适应多种密度和分辨率。–Daniel Lew

 

关于Android中如何适应不同的屏幕大小及分辨率,看了一些文章,其中比较经典的一个stackoverflow上的讨论《Android手机上px,dp,dip和sp的区别》,下面让我们看看dp和px的区别

先直观地看看dp和px的显示效果。

Android中px和dip的区别

图1.设置相同的px,界面元素在不同的屏幕密度下的表现

    从图1中,我们可以看出,当屏幕的尺寸(用英寸来表示)相同时,在不同屏幕密度(density)下,用等大的像素来表示的时候,在低屏幕密度的屏幕上显示得比较大(如上图中的左侧图片),在高屏幕密度的屏幕上显示得比较小(如上图中的右侧图片)。

Android中px和dip的区别

图2.设置相同的dip,界面元素在不同的屏幕密度下的表现

     从图2中,可以看出,在屏幕的尺寸相同时,而屏幕的密度不同是,界面元素在铺在界面上的比例相同。这是因为图2中界面元素的显示单位用的是dip,它能够根据屏幕密度自动调整界面元素的大小,让界面元素以恰当的比例显示在屏幕上。

注意:当两块屏幕的长和宽可以用相同的dip来表示的话,那么界面元素能够按照屏幕密度自动拉伸到恰当的大小,但是如果两块屏幕的长宽不能用相同的dip元素来表示的话,那么界面虽然会根据屏幕密度拉伸,但是拉伸的比例也不会正确。因为根据dip、屏幕密度进行拉伸的原理,其实是长或宽的dip数乘以屏幕密度进而得到正确的像素(pixels),因为最终要显示到屏幕上的时候,必须要将界面显示的单位落实到像素(pixels)上,只是Android系统自动帮我们完成了这个转换的工作。

dp(dip)是什么

dp(或dip)的全称是Density-independent Pixels(密度独立像素) 。dp是一个抽象单位,建立在屏幕的物理密度上。这些单位都是相对于一个160 dpi(dots per inch 每英寸拥有的点数)屏幕,上面1 dp几乎等于1 px。当运行在更高密度的屏幕上,原先描绘1dp的像素需要根据一个合适的比例扩大到一定的数量,以便适合屏幕的dpi。同样,当在一个低密度屏幕,用来显示1dp的像素需要按比例缩小一定的数量。dp转化成pixe的比率会随着屏幕的密度改变,但不一定成正比。使用dp单位(而不是px)是一个简单的解决方案,使得在你的布局(LayOut)中界面元素的大小,能根据不同的屏幕密度调整到适当的大小。换句话说,它提供了在不同的设备中,UI元素实际大小的一致性。

px是什么

Pixels(像素)——对应于实际的像素在屏幕上。这个单位是不建议使用的,因为界面可能需要显示在多个设备中,每个设备可能有不同屏幕密度和屏幕上所有像素的数量可能更多或者更少。

什么时候用dip

当屏幕的长宽用dip表示时,长宽都是相同的话,那么就可以使用dip进行界面元素的大小的布局,Android会自动帮我们拉伸到合适的尺寸,但是,如果屏幕差异太大的话,那么用dip进行布局大小的限定还是会出现问题的。

 

示例代码

参考链接

Supporting Multiple Screens

Android实用代码七段(一)

Android屏幕密度(Density)和分辨率的关系

Android Density(密度)

Dimension

Difference between px, dp, dip and sp in Android?

转载于:https://www.cnblogs.com/kissazi2/p/3307020.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110021.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 写代码有这16个好习惯,可以减少80%非业务的bug[通俗易懂]

    写代码有这16个好习惯,可以减少80%非业务的bug

  • 云计算与边缘计算协同 九大应用场景

    云计算与边缘计算协同 九大应用场景来源:物联网报告中心前言2019年边缘计算备受产业关注,一度引起了资本市场的投资热潮,很多人把2019年称作边缘计算的元年。理性来看,造成如此火爆局势难免有…

  • webpack图片压缩_webpack图片打包加速

    webpack图片压缩_webpack图片打包加速图片处理url-loader(webpack5之前的处理方式)在项目开发中,我们时长会需要使用到图片,比如在img文件夹中有图片test1.png,然后在normal.css中会引用到图片body

  • 几款永久免费内网穿透,好用且简单(内网穿透教程)

    对于网络用户来说,一定都经历过出门在外无法直接在外网访问内网、或是难以部署异地远程桌面,因此心急如焚的情况;对于企业来说,无论是财务管理软件难以将分店信息同步到总部进行统计汇总、还是员工出差在外或在家里就不能访问企业内部办公系统,都极大地影响了公司整体效率;对于个人开发者来说,微信小程序或者在线支付系统等开发环境往往需要一个可以外部访问的公网环境进行调试,而大多数的企业网络都被运营商做了转发设置,…

  • JVM 优化经验总结

    JVM 优化经验总结一、JVM架构图1.JVM总体概述JVM总体上是由类装载子系统(ClassLoader)、运行时数据区、执行引擎、内存回收这四个部分组成。其中我们最为关注的运行时数据区,也就是JVM的内存部分则是由方法区(MethodArea)、JAVA堆(Heap)、虚拟机栈(Stack)、程序计数器、本地方法栈这几部分组成;除此以外,在概念中还有一个直接内存的概念,事实上这部分内存并不属于虚拟机规范中定义的内存区域,但是因为在JDK1.4+后新加的NIO类,以及JDK1.8+后的Metaspace的关系,所

  • iscsiadm命令详解_adm激活成功教程版

    iscsiadm命令详解_adm激活成功教程版iscsiadm是open-iscsi包中的一个工具,用来发现和登陆iSCSItar

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号