dpi densityDpi的一些理解(慎入,不一定对)

本文详细介绍了手机屏幕尺寸、分辨率和像素密度(dpi)的概念,强调了几何尺寸、像素点数和显示清晰度之间的关联。讨论了dp(设备独立像素)、dip、dpi、sp、px之间的区别,并解释了如何影响屏幕显示效果。还探讨了densityDpi的变化如何影响资源选择,以及在不同显示设置下如何保持UI适配。最后,指出在UI设计中考虑不同屏幕尺寸和分辨率的重要性。
摘要由CSDN通过智能技术生成

屏幕尺寸

通常说的几寸屏,指手机屏幕的对角线的长度,单位是英寸。(1英寸 = 2.54厘米)
比如5寸屏,5.5,6寸屏等等

屏幕分辨率

指屏幕的像素点数,单位是px,比如1960 * 1080.通常图片或照片这种都是像素,所以屏幕越大越可以清晰显示高清图片,否则比如手机屏幕是480* 800,但图片是2000的,那么图片放到屏幕中,就需要缩小2倍以上,即图片每2个多像素就要合并成1个(或舍弃一个?)才能展示在屏幕中,也就失真了。

屏幕像素密度 dpi

指每英寸上的像素点,它和dp/dip有直接关系。意为:dot per inch。
每英寸含的像素点越多(通常是基于160翻倍的多),也就代表每dp(设备独立像素)可以代表更多的px。

dp、dip、dpi、sp、px、density

请添加图片描述

  • px:像素单位,常见的图片照片等都是指的像素
  • dp/dip:这俩是一个意思,dip不要和dpi搞混。指设备独立像素(一个硬件dp单位点里可以装多个px)
  • dpi:上述得屏幕像素密度,所谓得关联显而易见,一英寸包含多少像素是dpi。一英寸里得设备像素是固定的,一英寸放的px多,就代表每个独立设备像素点里包含的px多。~~即1dp= n px。N越大越高清,dpi也越大。~~修正dp和px的关系,与density有关,density与densityDpi有关,densityDpi和Dpi没有关系按定义来说,如果这里的dpi不是densityDpi的话,那么这个dpi基本对于适配来说没有作用。如图的话,xdpi和ydpi才是这个定义的dpi,算成对角线的一英寸也是441左右的。而且改变显示大小的时候,这个xydpi是不变得,是符合定义得。但densityDpi和density是会随着"改变显示大小”而同步变大变小得。px = dp* density, density = densityDpi/160; 而看来这个densityDpi并不是dpi得定义所能满足得,手机得分辨率未变,屏幕尺寸也未变,当然每英寸得点没有变(xydpi未变),但densityDpi会变得。同时变得还有个叫scaledDensity得,不知道有没有关联。即使调整显示大小到最小使得当前densityDpi=450(<480),依然会读取xxhdpi中得资源。调整到最大,densityDpi是600,这时会读取xxx中得资源,所以之前考虑得h,xh,xxh这种以为是160得倍数都读取此倍数得,160,320,480,640,以为是[160,320)是m,h,【320,480)是xh,【480,640)是xxh,【640,)是xxxh的结论是错误的,当时以为是一档一档的,过了槛儿就算下一档了,其实是densityDpi更靠近哪个就按哪个算,其实更简单点就是desityDpi/160后四舍五入取整,1 m,1.5 h,2 xh,3 xxh,4 xxxh。若图中所示,此时3.75四舍五入为4,所以读取xxxh资源。
  • sp:文本大小的单位。通常其实和dp等效。但是sp是会受系统“文字大小”的设置改变的。如果文本使用sp,修改系统设置文字大小,文字会变大,使用dp则不会变大。
  • px:就是像素了。
  • density,densityDpi:density是屏幕密度,以densityDpi=160为基准,densityDpi/160就是density,dp* density = px。归根结底就是一个设备独立像素越能代表多个px,也就是density越大,那每英寸的设备独立像素是一定的,那每英寸的px就越多,即densityDpi也就越大

显示大小:调大后,分辨率是不变的,代码中都是用dp为单位,所以显示变大,那长宽的总dp就要变小,这样设置的dp所占比例就大了。总dp变小,px不变,意味着density要变大,(dpi不会变大,经历中,xdpi和ydpi才是每英寸像素的定义。而densitydpi会变大,它并不是dpi,当时把这搞混了)每个dp中的像素就变大了。如果xml中使用px为单位,改变显示大小是无效的(但基本不会用px为单位,否则本身适配就有问题)

补充下个人的理解(densityDpi,dpi)

dpi的含义就是每英寸的像素数。屏幕的物理尺寸(英寸数)是不变的,分辨率不改系统设置(有的系统设置可以更改分辨率)也是不变的,那么dpi按定义来说就不会变化。即上面说的xdpi,ydpi这些都没有变化过。
那么densityDpi是个啥,为啥会变?而且看density或使用xxxhdpi这些资源的时候,都是densityDpi在起作用,和dpi看起来是没有关系的。我这里感觉可以把px,dpi归于“物理实际尺寸”屏幕亮不亮的都是这个尺寸,属于硬件,就在这,变不了。DensityDpi,我觉得可以理解成屏幕亮起时里面的绘制“画布”的虚拟属性(受约于实际物理尺寸,毕竟分辨率在那变不了)。

华为p40手机默认“显示大小)是第二档,但如果调到最小的话是450densityDpi。xdpi一直都是441,其实相差不多。但为了较高清的体验,所以densityDpi默认调制了530(第二档)。调到最大时是600了,这时使用xxxhdpi的资源了。

我是这样理解的(不知道对不对,先记下),densityDpi变成600(变大),但是分辨率是不变的,就那么多px,”虚拟“的计算体系下(density是密度的意思,用”虚拟“是为了和实际物理的尺寸进行概念隔离),我现在dpi就是600了,分辨率没变,实际上可以认为这个体系下,我已经是个”4寸屏(未计算,意思就是我是个更小的屏幕了,但分辨率还是那么大,我更高清了)“了(原大小是6.几寸)。所以现在画布上的东西其实都是在虚拟计算提下换算成的,这时我就要使用xxxdpi里的资源了,因为我更高清了嘛。然后各种绘制云云后,这个”4寸屏“要呈现在实际物理6.x寸上,这时layout就相当于放大到6寸上,也就相当于”显示大小“设置成了”大“。(如果使用xxdpi里的图,就会产生一定程度上的模糊、锯齿了)

其实这种思考也有点类似于我们自己操作画布,比如matrix先变小,然后绘制再放大等。

再补充一点:

上述自然还有一个项目中遇到的问题,就是dpi530时,高度的dp数是800多,变成600时,高度只有600多dp,这个直接计算就可以了。毕竟要绘制完要“放大”到屏幕物理尺寸的,计算的话也一样densityDpi变大,density也变大了,分辨率没变,那么1dp等于更多的像素了,那么总dp数就变少了。之所以说到这一点,是关于ui设计的问题,如果这个页面是不可滑动的(比如对接了一些三方sdk,比如一键登录相关的)布局是纵向下来的,如果设计稿只按照800dp“精美”设计,而没有保留一定的空白空间,那么发生“显示大小,字体大小,分辨率大小(这个改变不影响dp数,但是如果和显示大小一起做兼容可能会引发问题)”的设置修改时,这个界面就不会美观了。然后再再再说一点,即使不动大小设置,有些手机它本身就是只有360*640dp,计算的话,它也是个(16:9)的手机,所以如果只按800多dp高度的手机设计的ui在640这个手机上也是会出问题的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值