Android 屏幕适配

一、基本概念

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);


Android 屏幕适配_第1张图片
dpi公式

举个例子:屏幕分辨率为:1920*1080,屏幕尺寸为5吋的话,那么dpi为440。

Android 屏幕适配_第2张图片
dpi公式

详情请参见:

https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA


三、屏幕适配原理

            屏幕适配的关键点是:density(屏幕密度比例).

           从dp和px的转换公式 :px = dp * density

            可以看出,如果设计图宽为360dp,想要保证在所有设备计算得出的px值都正好是屏幕宽度的话,我们只能修改 density 的值。

            AndroidAutoLayout(鸿洋适配框架)和 AndroidAutoSize(今日头条适配方案)都是这个思路。

            图片适配系统就是根据不同的density给我们提供了不同的drawable文件夹

Android 屏幕适配_第3张图片
density


四、获取屏幕像素密度和密度比例


①、通过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

Android 屏幕适配_第4张图片
adb 获取屏幕密度

通过上图可以获得dpi为160,根据density = dpi / 160公式,可以得出density =1;


③、安装屏幕测试专家直接进行检测

Android 屏幕适配_第5张图片
屏幕检测专家截图

五、如何适配?

①、使用框架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

你可能感兴趣的:(Android 屏幕适配)