android 屏幕适配机制

内容太长,总结提前:

  1. 同一设备,横屏和竖屏的宽是相反的 (及sw)
  2. 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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值