Android 屏幕适配
一、屏幕适配的常用概念:
1: dp: android 尺寸的基本单位。 在不同的分辨率的手机里面,1dp对应着不同数量的px, 这样就实现了dp定义一个控件大小的时候,在不同分辨率手机里表现出相应大小的像素值。
2: 屏幕分辨率: 1080下160, 表示宽度有1080个像素点而高度有2160个像素点。常见的分辨率有320x480, 480x800, 720x1280, 1080x1920等。
3: 屏幕尺寸: 以寸为单位, Android设备对角线的长度
4: 像素密度: 每英寸的像素点
5: 屏幕尺寸, 分辨率,像素密度 三者之间的关系:
密度(dpi)= √(宽2 + 高2)/屏幕尺寸
1: 勾股定理求出对角线的像素尺寸
2: 除以屏幕尺寸即可以得到每寸的像素, 即为像素密度
6: px:像素,是屏幕上显示数据的最基本的点
7: dpi:屏幕像素密度,每英寸上的像素点数
8: sp:与dp类似,通常用于指定字体的大小,当用户修改手机显示的字体时,字体大小会随之改变。
二、 屏幕适配的几种方式:
1: dp适配方案: Android自带的原始的适配方案, 在不同的分辨率手机里面表现出相应大小的像素点。
缺点: Android的碎片化严重, 如果生产厂家没有根据屏幕尺寸、分辨率和像素密度的关系来规则定义, 或者出一些乱七八糟的屏幕大小,这样的适配方案就不在适合了。
2: 宽高限定符:枚举所有的屏幕宽高像素值,根据等比缩放去适配。如果没有找到对应的屏幕, 则取默认的。 目前这种方案已经被弃用。
1: 首先设定一个基准屏幕, 如320x480为基准。那么所有的屏幕,宽都会被分成320份, 高被分成480份。 x1 = 1px, x2= 2px ... x320 = 320px; h1 = 1px, h2 = 2px... h480 = 480px。
2;确定需要适配的屏幕: 如480x800, 那么此屏幕宽高会同样被分成320份, 高被分成480份, 每份的宽高为: x1= 1.5px, x2= 3px,...,x320=480px; h1=2.0px,h2 = 4.0px ... h480 = 800px。
3:使用工具生成: autoLayout.jar
4: java -jar autoLayout.jar width height width,height_width,height
如: java -jar autoLayout.jar 1888 1728 2560 1600
以1888x1728为基准, 需要适配的屏幕为2560x1600的屏幕
缺点:
1: 占用资源大,会增加APK的体积。
2: 容错机制大需要精准命中资源文件才能适配,比如1920x1080的手机就一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形。
3:AndroidAutoLayout适配方案(停止维护)
1: 引入框架implementation 'com.zhy:autolayout:1.4.5'
2: AndroidManifest中配置文件注明设计的尺寸:
<meta-data android:name="design_width" android:value="720" />
<meta-data android:name="design_height" android:value="1280" />
3: 转换引入的布局的形态:
LinearLayout -> AutoLinearLayout
RelativeLayout -> AutoRelativeLayout
FrameLayout -> AutoFrameLayout
在布局里面声明控件,单位全部为px
4: SW限定符适配方案:(smallestWidth最小宽度适配)
Android 会去识别屏幕可用高度或者宽度的最小尺寸的dp值。然后根据识别到的结果去对应的资源文件里面去找寻相应的结果。
如何生成:ScreenMatch插件
1: File -> Settings -> Plugins ,搜索ScreenMatch关键字,安装插件
2: 项目values文件夹下需要一份dimens.xml文件,即前面说的默认基准尺寸文件
3: 根据基准尺寸文件,执行screen match操作
4:执行此插件会生成screenMatch.properties的文件, 里面base_dp会指定最小宽度基准值,match_dp会生成适配宽度的的dimens.xml的文件, ignore_dp会忽略哪些对应的宽度
此方案跟宽高限定的适配方案相比,有很好的容错机制, 如果没有找到对应的适配宽度, 那么会在vlues文件里面去找跟他最接近的宽度。
5:今日头条适配方案:
1>: px 转 dp 的公式 dp = px / density.不管我们设定的单位是什么, 最终我们都会将这些单位长度转化为px的。density就是他们的转化比, 所以,动态改变这个转化比也是可以达到我们适配屏幕的目的的。
2>: 通过修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值(在清单文件中定义),这样就解决了所有的适配问题。
3>: Density = 当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) ;
4>:引入了AndroidAutoSize屏幕适配框架:
https://github.com/JessYanCoding/AndroidAutoSize
1: 引入 implementation 'me.jessyan:autosize:1.1.2'
2: 如果您项目中的所有页面都只需要以高或宽中的一个作为基准进行适配的话, 那就只需要填写高或宽中的一个设计图尺寸即可
<meta-data android:name="design_width_in_dp"
android:value="360"/>
<meta-data android:name="design_height_in_dp"
android:value="640"/>`
最后, 最重要的................
点赞 点赞 点赞, 不重要的事情也就说3遍......