关于屏幕分辨率问题

1.概念问题

  • 屏幕分辨率 :指在手机屏幕上面的像素点数 比如19201080、1080720
  • 屏幕像素密度 (ppi):指每英寸上面的像素点的个数,单位是ppi,计算方式为(1280*1280 + 1920*1920)开方 / (x*x + y*y)开方 可根据上面的勾股定理计算
  • 像素密度(dpi): 物理概念,是定死的,客观存在的不会改变,是人为定的值,比如几部不同分辨率不同尺寸的ppi可能分别是430,440,450,那么在Android系统中,可能dpi会全部被指定为480
  • 屏幕无关像素(dp/dip):Android的一个设计单位,是物理单位,跟屏幕像素密度无关,只不过跟像素存在换算关系,160dpi 是系统为 mdpi 屏设定的基准密度,也就是说在mdpi的手机上,1px = 1dp = 1英寸/160,所以dp和px的换算关系为:px = dp * dpi /160,也就是说1dp的大小是固定的,但是在不同手机上1dp的物理长度包含的像素点个数不同,在160dpi的手机上1dp = 1px,其他手机分辨率越高,1dp包含的像素个数越多
  • 对应关系
ldpi   -> 120dpi   1dp = 0.75px
mdpi   -> 160dpi   1dp = 1px
hdpi   -> 240dpi   1dp = 1.5px
xhdpi  -> 320dpi   1dp = 2px
xxhdpi -> 480dpi   1dp = 3px  (目前这种是主流dpi)
xxxhdpi-> 640dpi   1dp = 4px (市场上很多手机已经是这种dpi了)

备注:假如自己算出来的ppi是443,那么在Android系统中会向上取整,所以会认为你的dpi是480,所属的屏幕为xxhdpi

2.屏幕适配问题

为什么会存在屏幕适配这个问题呢?举个栗子,1080p的手机,大部分手机拿到的densityDpi=480,density=3,但是Google Pixel得到的却是densityDpi=420,density=2.625,也就是说当你有一个View宽度写为了360dp那么在大多数手机上是充满全屏的,但在部分手机(比如上面的Pixel)却显示不了全屏,所以为了能够在所有手机上都显示同样的效果,就需要进行屏幕适配。

一般情况下,我们的页面在高度这个维度上都是需要滑动的,而且大部分情况是不限制死高度的,所以我们需要做的是尽可能在宽度上保证所有手机一致,那么我们就可以只在宽度上面进行适配。

那么怎么适配呢?假如UI出图是基于1920px*1080px,那么我们可以认为总的宽度是360cp(cp是随便写的一个单位,意思是custom px),那么可以得出1cp = 3px,这样的话在720p的屏幕上按照比例就可以得到1cp = 2px,根据这个原理我们就可以穷举市场上所有的屏幕尺寸按照宽度来适配,但是可能穷举不全,所以需要给默认的, 在下面的目录下面的xml文件配置<dimen name="1cp">3px</dimen> ,配置项目中所需要的尺寸

values
values-mdpi         <dimen name="1cp">1px</dimen>  
values-hdpi         <dimen name="1cp">1.5px</dimen>
values-xhdpi        <dimen name="1cp">2px</dimen>
values-xxhdpi       <dimen name="1cp">3px</dimen>
values-xxxhdpi      <dimen name="1cp">4px</dimen>
values-480*320      <dimen name="1cp">0.88px</dimen>
values-800*480      <dimen name="1cp">1.33px</dimen>
values-854*480      <dimen name="1cp">1.33px</dimen>
values-960*540      <dimen name="1cp">1.5px</dimen>
values-1024*600     <dimen name="1cp">1.66px</dimen>
values-1024*768     <dimen name="1cp">2.13px</dimen>
values-1184*720     <dimen name="1cp">2px</dimen>
values-1196*720     <dimen name="1cp">2px</dimen>
values-1280*720     <dimen name="1cp">2px</dimen>
values-1280*800     <dimen name="1cp">2.22px</dimen>
values-1812*1080    <dimen name="1cp">3px</dimen>
values-1920*1080    <dimen name="1cp">3px</dimen>
values-2560*1440    <dimen name="1cp">4px</dimen>

人为写的话比较繁琐,可以通过跑脚本来实现

算法就是 宽度 / 360 * n = n(cp),其实就是按宽度将屏幕分成360份(分成多少份都可以,一般按照UI来,这样比着UI图做UI的时候好对应),分完之后,每一份是1cp,50cp就需要再乘以50,然后配置在对应的资源文件里面

可以参考其他成熟方式,其中有一个今日头条的适配方案其实跟本方案是一样的,只不过他的写法更简单
进入头条UI适配方案

头条UI适配方案问题解决参考1
头条UI适配方案问题解决参考2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值