Android屏幕适配笔记
最近做项目遇到了屏幕适配的问题,当然如果只是面向主流开发,也不太需要做适配了,但是适配一下总是比较好的。
也查了很多文章,这里做下笔记吧。详细分析看一下我贴的原文章链接。
屏幕适配
名词解释
px (pixel): Android中代表绝对像素,比如 160px 的控件在分辨率为宽 320px 的设备中占一半,在分辨率为宽 640px 的设备中占 1/4。所以这在开发中肯定不被推荐使用。
dpi (dots per inch): 为了避免使用 px 带来的问题,dpi 翻译过来就是每一英寸的屏幕所包含的像素数。
举例来说,假设现在有一台“宽2英寸,长3英寸”的设备,则:
- 当该设备分辨率为“320*480”,则dpi值为160。
- 当该设备分辨率为“640*960”,则dpi值为320。
正是因为dpi值其代表的特性,所以android项目的资源文件下存在以下目录:
- drawable-ldpi ( 当dpi为120时,使用此目录下的资源)
- drawable-mdpi ( 当dpi为160时,使用此目录下的资源)
- drawable-hdpi ( 当dpi为240时,使用此目录下的资源)
- drawable-xhdpi ( 当dpi为320时,使用此目录下的资源)
- drawable-xxhdpi ( 当dpi为480时,使用此目录下的资源)
Android正是根据设备DPI值得不同,选择清晰度不同的资源使用,完成屏幕的适配。
DP/DIP (device independent pixels): Android引入的 dp 是设备独立像素,在Android当中规定:在屏幕密度为“160dpi”的情况下,则刚好“1dp = 1px”,当屏幕密度为“320dpi”时,则“1dp = 2px”,以此类推。
让我们回到上面说到的使用px造成的控件显示问题,此时我们将使用新的单位“dp”。于是:
- 在分辨率320*480(既dpi为160)的设备下,则160dp等价于160px,按钮占屏幕宽的一半。
- 在分辨率640*960(既dpi为320)的设备下,则160dp等价于320px,按钮依然占屏幕宽的一半。
**Density:**就这个单词本身直接翻译的意思而言,其也代表“密度”。但需要注意的是,在Android中,其实并非如此。
注意我们这里指的是,通过代码“context.getResources().getDisplayMetrics().density”获取的“density”值。
而通过该方法获取到的该值,实际上是等价于“dpi / 160”的一个结果值。也就是说:
“getResources().getDisplayMetrics().density” = “getResources().getDisplayMetrics().densityDpi / 160”
借鉴今日头条适配方案
今日头条适配原理:density =(当前屏幕分辨率宽或高(单位px))/(ui设计稿宽或高(单位dp)),这个表示的是1dp在当前分辨率下的所对于的像素
真正的view大小: realWidth = (ui设计稿上的宽度)*density
今日头条适配方案默认项目中只能以高或宽中的一个作为基准,进行适配,因为目前大部分市面上的 Android 设备的屏幕高宽比都不一致,这时我们只以高或宽其中的一个作为基准进行适配,就会有效的避免布局在高宽比不一致的屏幕上出现变形的问题。
density 在每个设备上都是固定的,DPI / 160 = density,屏幕的总 px 宽度 / density = 屏幕的总 dp 宽度
- 设备 1,屏幕宽度为 1080px,480DPI,屏幕总 dp宽度为 1080 / (480 / 160) = 360dp
- 设备 2,屏幕宽度为 1440px,560DPI,屏幕总 dp宽度为 1440 / (560 / 160) = 411dp
可以看到屏幕的总 dp 宽度在不同的设备上是会变化的,但是我们在布局中填写的 dp 值却是固定不变的
这时我们要想完美适配,那就必须保证这个 View 在任何分辨率的屏幕上,与屏幕的比例都是相同的
这时我们该怎么做呢?改变每个 View 的 dp 值?不现实,在每个设备上都要通过代码动态计算 View 的 dp 值,工作量太大
如果每个 View 的 dp 值是固定不变的,那我们只要保证每个设备的屏幕总 dp 宽度不变,就能保证每个 View 在所有分辨率的屏幕上与屏幕的比例都保持不变,从而完成等比例适配,并且这个屏幕总 dp 宽度如果还能保证和设计图的宽度一致的话,那我们在布局时就可以直接按照设计图上的尺寸填写 dp 值。
当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = density
这个公式就是把上面公式中的 屏幕的总 dp 宽度 换成 设计图总宽度,原理都是一样的,只要 density 根据不同的设备进行实时计算并作出改变,就能保证 设计图总宽度 不变,也就完成了适配
使用
本文地址:https://blog.csdn.net/sinat_41895958/article/details/107563890