android屏幕适配的理解
android屏幕适配的理解
经常在开发中被dp、px搞的很头大,就理了下android适配。
首先要理解android屏幕适配在做什么,就是在不同的手机上看到的ui效果是一致的。
我觉的,不管是什么适配方案,最终都要归结于px,为什么,因为屏幕就认识px啊,他不认dp,对于屏幕而言,你的程序只要告诉我你要渲染的内容宽是多少像素、高是多少像素。
但是,如何用一套代码在不同分辨率的手机上显示相同效果呢?要达到这个目的,就需要在代码中告诉手机在不同的分辨率手机上应该渲染几个像素。
方案一:
于是,最直接的方案就是
├── src/main
│ ├── res
│ ├── ├──values
│ ├── ├──values-800x480
│ ├── ├──values-860x540
│ ├── ├──values-1024x600
│ ├── ├──values-1024x768
│ ├── ├──...
│ ├── ├──values-2560x1440
让系统选择对应分辨率的dimens.xml 。其本质是按比例在不同分辨率设备上设置需要渲染像素的大小。既然是按比例,就需要有个基准,其他分辨率都按照这个基准进行缩放。
但是这个方案有个缺陷,就是系统如果找不到对应的分辨率就会直接匹配默认的dimens.xml,这样的后果就是部分匹配不到的设备ui差别太大。
怎么解决这个问题呢?于是有人提出了方案二:
虽然系统不能就近匹配分辨率,但是可以就近匹配dp啊,于是方案二是这样:
├── src/main
│ ├── res
│ ├── ├──values
│ ├── ├──values-sw320dp
│ ├── ├──values-sw360dp
│ ├── ├──values-sw400dp
│ ├── ├──values-sw411dp
│ ├── ├──values-sw480dp
│ ├── ├──...
│ ├── ├──values-sw600dp
│ ├── ├──values-sw640dp
这俩个方案的本质是一样的,为什么呢?
首先看下这个values-sw360dp是怎么算出来的,假设设备的像素是1920*1080,dpi = 480,那么计算values = 1080/(480/160),由于最终的像素值还是要用dp * (dpi/160),因此,这种方式本质还是像素的缩放,只是系统会做就近匹配。
我一直有个疑问,使用dp会不会有风险啊,因为获取到的dpi是可以厂商直接写进去的,例如这样:
ro.sf.lcd_density=320
如果设置的不准,跟实际物理dpi(像素值/尺寸)相差很远,会不会有问题。
还是以像素1920*1080,dpi = 480为例,values-sw360dp如下:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<dimen name="dp_1">1dp</dimen>
<dimen name="dp_2">2dp</dimen>
<dimen name="dp_3">3dp</dimen>
<dimen name="dp_4">4dp</dimen>
<dimen name="dp_5">5dp</dimen>
<dimen name="dp_6">6dp</dimen>
<dimen name="dp_7">7dp</dimen>
<dimen name="dp_8">8dp</dimen>
<dimen name="dp_9">9dp</dimen>
<dimen name="dp_10">10dp</dimen>
...
<dimen name="dp_356">356dp</dimen>
<dimen name="dp_357">357dp</dimen>
<dimen name="dp_358">358dp</dimen>
<dimen name="dp_359">359dp</dimen>
<dimen name="dp_360">360dp</dimen>
</resources>
如果系统设置dpi = 320,那按照方案二获取到的应该是values-sw540dp,如下:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<dimen name="dp_1">1.5dp</dimen>
<dimen name="dp_2">3dp</dimen>
...
<dimen name="dp_360">540dp</dimen>
</resources>
由于最终都要转化成像素,1dp在dpi = 480标注的系统里获取到的像素是1dp * (480/160) = 3px,在dpi = 320标注的系统里获取到的是1.5dp * (320/160) =3px,可见,效果是一致的。因此,方案二容错率更高一些。
参考地址:https://zhuanlan.zhihu.com/p/144487134
本文地址:https://blog.csdn.net/chao18867105705/article/details/108981301
上一篇: 推荐笔记本机械硬盘(笔记本机械硬盘选购方法及测评)
下一篇: E 地、颜色、魔法