一、基本概念
dip/dp: Density independent pixels,密度无关像素。
dpi:dots per inch(屏幕像素密度), 直接来说就是一英寸多少个像素点。常见取值 120,160,240。
density: 密度(密度比例)。常见用密度1.0、1.5、3.0。
分辨率: 屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以*横向像素*纵向像素,如1080*1920。
屏幕尺寸: 屏幕对角线的长度。电脑、电视、手表同理。
二、dp、dpi、px、density之间的关系
● dpi=屏幕的对角线的分辨率/屏幕尺寸
● density = dpi / 160;
● px = density * dp;
● px = dp * (dpi / 160);
举个例子:屏幕分辨率为:1920*1080,屏幕尺寸为5吋的话,那么dpi为440。
详情请参见:
https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA
三、屏幕适配原理
屏幕适配的关键点是:density(屏幕密度比例).
从dp和px的转换公式 :px = dp * density
可以看出,如果设计图宽为360dp,想要保证在所有设备计算得出的px值都正好是屏幕宽度的话,我们只能修改 density 的值。
AndroidAutoLayout(鸿洋适配框架)和 AndroidAutoSize(今日头条适配方案)都是这个思路。
图片适配系统就是根据不同的density给我们提供了不同的drawable文件夹
四、获取屏幕像素密度和密度比例
①、通过DisplayMetrics获取,如:dp转px的工具内(getResources().getDisplayMetrics().density)
DisplayMetrics#density 就是上述的density
DisplayMetrics#densityDpi 就是上述的dpiDisplay
Metrics#scaledDensity 字体的缩放因子,正常情况下和density相等,但是调节系统字体大小后会改变这个值
②、Android 4.3引入的wm工具:
a.获取Android设备屏幕分辨率: adb shell wm size
b.获取android设备屏幕密度: adb shell wm density
通过上图可以获得dpi为160,根据density = dpi / 160公式,可以得出density =1;
③、安装屏幕测试专家直接进行检测
五、如何适配?
①、使用框架AndroidAutoSize(今日头条适配方案)。
https://github.com/JessYanCoding/AndroidAutoSize
②、 不使用框架适配
1、适配不同尺寸避免写死的尺寸值;wrap_content,match_parent,weight。
2、使用相对位置的RelativeLayout。
3、考虑使用自动拉伸.9图
4、限定符;最小宽度限定符,屏幕方向限定符,布局别名。
具体操作实现请参考:
Android 屏幕适配:最全面的解决方案
https://www.jianshu.com/p/ec5a1a30694b
Android 适配时资源限定符的说明
https://blog.csdn.net/shishuinianshang/article/details/76154913
Android屏幕适配全攻略
https://www.jianshu.com/p/759375113de9
一种非常好用的Android屏幕适配
https://www.jianshu.com/p/1302ad5a4b04
六、适配框架推荐:
AndroidAutoLayout(鸿洋适配框架) --已停止维护
https://github.com/hongyangAndroid/AndroidAutoLayout
AndroidAutoSize(今日头条适配方案)都是这个思路。
https://github.com/JessYanCoding/AndroidAutoSize
参考文章
https://www.jianshu.com/p/759375113de9
https://www.jianshu.com/p/ec5a1a30694b
https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA