内容太长,总结提前:
- 同一设备,横屏和竖屏的宽是相反的 (及
sw
) - layout,value,mipmap.... 是独立适配的,
如layout-sw600dp下写布局,就适配了所有大于600宽度的设备,但是里面的距离可以分别使用values-sw600dp,values-sw700dp,values-sw800dp.......中的引用值,这样布局只写一次,分设备设置大小
换言之在 xxx-sw600dp中的引用值(xxx 为layout,values,mipmap.....),是根据设备调用自身信息去寻找的,而不是使用同一设定下(-sw600dp)的值
I.引入
资源文件适配,其中包含众多内容,如值适配,语言适配,
首先打开文件夹生成界面,右击工程目录 -> New -> Android Resource Directory
添加资源文件夹的界面如下:
Resource type | 包含所有的资源文件类型,如layout,value,mipmap,xml,color,anim...还有raw;就是所有资源文件可以适配 |
Source set | 默认为main(),为build.gradle 中 buildTypes和 produceFlavors 的交叉组合 |
Acailable set | 截图中为所有可选类型,包含屏幕宽,屏幕高,横竖屏,版本,布局方向,像素大小等 |
Choose qualifiers | 可以多选,条件为合并关系,如图 会生成 values-long-port 文件夹,表示宽屏并且竖屏时引用(迷糊?看资源介绍) |
通常 Resource type 配合 Acailable set , 即可做绝大多数适配,少数的调试值,渠道区分会使用Source set !!!
更多资源文件的内容可以看我的笔记:https://blog.csdn.net/qq_19973845/article/details/103459712
抽个重点:
Android 如何查找最佳匹配资源
当您请求要为其提供备用资源的资源时,Android 会根据当前的设备配置选择要在运行时使用的备用资源。为演示 Android 如何选择备用资源,假设以下可绘制对象目录分别包含相同图像的不同版本:
1.drawable/
2.drawable-en/
3.drawable-fr-rCA/
4.drawable-en-port/
5.drawable-en-notouch-12key/
6.drawable-port-ldpi/
7.drawable-port-notouch-12key/
这里寻找资源的顺序只能是7->6->5->4->3->2->1,绝不会倒过来,
那么特别注意: layout,drawable,value,等等绝对不会升级寻找!
但是layout,drawable,value之间的的引用值却是相对独立的,比如layout下引用了@dimen/buttonHeight,在value和value-sw600dp下均创建该值,运行在平板中则是引用value-sw600dp下的@dimen/buttonHeight,运行在手机上则是value中的!
II.屏幕适配
屏幕适配是android 众多适配中的重要一角,与之相照应的是value,layout,color,drawable,mipmap的配套.
1.屏幕适配的关键因素:横竖屏,屏幕大小,像素密度
横竖屏:就两种情况,通常在适配也是在横屏情况下做成平板一样的左右布局
屏幕大小: 在这里 通常用于判断是否为平板,先继续看...
下面是其他最小宽度值与典型屏幕尺寸的对应关系:
- 320dp:典型手机屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi 等)。
- 480dp:约为 5 英寸的大手机屏幕 (480x800 mdpi)。
- 600dp:7 英寸平板电脑 (600x1024 mdpi)。 -->(注释:我发现M3 8.4寸平板<显示模式为 大[有 小,中,大]>居然是534dp)
- 720dp:10 英寸平板电脑(720x1280 mdpi、800x1280 mdpi 等)。
下面提供了一个更详细的视图,说明了不同屏幕 dp 宽度与不同屏幕尺寸和方向的一般对应关系。
典型的平板电脑测试环境可以包含下表中每行的一种或两种设备,采用所列的一种平台版本、屏幕配置和硬件功能配置。
类型 | 尺寸 | 密度 | 版本 | AVD 主题 |
7 英寸平板电脑 | large 或-sw600 | hdpi 、tvdpi | Android 4.0 及更高版本 (API 级别 14 及更高) | WXGA800-7in |
10 英寸平板电脑 | xlarge 或-sw800 | mdpi 、hdpi 、xhdpi | Android 3.2 及更高版本 (API 级别 13 及更高) | WXGA800 |
做平板适配的根据:
在模拟器中window 为large是就为平板,而真机则不能正确识别,甚至xlarge都没有效果;
这里还是得使用 最小dp宽度来最区分,模拟器,真机均能正确识别;
像素密度: 像素密度的适配为了 正确的加载正确大小的图片,避免系统放大或压缩图片导致图片不清晰;
有一个公式是px(像素)与dp(密度无关像素 )的转化关系:px = dp * (dpi / 160)
dpi:图像每英寸长度内的像素点数。
dp:xml布局中的使用单位
px:就是像素🌶
这里有一个示例:
在自定义View时,通常有手势的相应,而何时响应则需要我们计算,因为xml中我们设置的是dp,而代码中获取的是px,
假定用户滑动16dp ,应当响应手势,我们则需要计算出在设备中对应的像素值,代码如下:
// The gesture threshold expressed in dp
private static final float GESTURE_THRESHOLD_DP = 16.0f;
// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);
不同像素密度下建议的图片文件夹(drawable,mipmap),及其大小
36x36 (0.75x) | 48x48(1.0x 基准) | 72x72 (1.5x) | 96x96 (2.0x) | 144x144 (3.0x) | 192x192 (4.0x) |
低密度 (ldpi) | 中密度 (mdpi) | 高密度 (hdpi) | 超高密度 (xhdpi) | 超超高密度 (xxhdpi) | 超超超高密度 (xxxhdpi) |