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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • php 该如何获取从百度搜索进入网站的关键词

    php 该如何获取从百度搜索进入网站的关键词

    2021年10月30日
    39
  • Linux系统下安装jdk及环境配置(两种方法)

    Linux系统下安装jdk及环境配置(两种方法)这里介绍两种linux环境下jdk的安装以及环境配置方法在windows系统安装jdk以及环境配置,相信大家都会,这里就不做赘述了,这里主要讲讲linux下的jdk安装以及环境配置。第一种属于傻瓜式安装,一键安装即可(yum安装);第二种手动安装,需要自己去Oracle官网下载需要的jdk版本,然后解压并配置环境,整个过程其实很简单。一、yum一键安装这种办法简单粗暴,就像盖伦丢技能…

    2022年6月11日
    41
  • Pytest(16)随机执行测试用例pytest-random-order「建议收藏」

    Pytest(16)随机执行测试用例pytest-random-order「建议收藏」前言通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。pytest默认运行用例的顺序是按模块和用例命名的ASCII编码

    2022年7月31日
    4
  • ios事件-触摸事件2(手势 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)

    ios事件-触摸事件2(手势 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)ios事件-触摸事件2(手势和pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()、touchesCancelled()的关系)先看效果图本文中,凡是看到xxx(),即表示xxx是一个函数或者方法!!!事件分为事件传递和事件响应,其中,事件响应又称事件处理。具体代码FindViewViewContr…

    2022年7月25日
    7
  • 组装电脑购机指南和记录自己的装机过程[通俗易懂]

    组装电脑购机指南和记录自己的装机过程[通俗易懂]最近家里组装了一台电脑,从采购到组装,前前后后涉及的内容挺多的,我特地在此总结下,防止自己忘记心急的小白可以直接看配件每部分的总结,你可以略过枯燥的概念,直接比较配件参数数字大小1组装电脑需要哪些配件一般需要主板、CPU、内存条、显卡、硬盘、电源、CPU风扇、键鼠、显示器等2配件选购指南我这里主要介绍参数的比较,即“数字大小的比较”,不会有太多的新概念。有的参数越…

    2022年5月16日
    54
  • Android Sdk版本、Support包版本及常用框架最新版本汇总

    Android Sdk版本、Support包版本及常用框架最新版本汇总1.SDKVerion数据来源于维基百科,和一篇博客Api版本号代号发布时间主要更新内容11.0无2008-09-23Web浏览器显示,短信,媒体播放器,相机,Wifi及蓝牙支持21.1PetitFour(花式小蛋糕)2009-02-09邮件中保存附件31….

    2022年5月29日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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