Android屏幕适配

一、Android屏幕适配-->基本概念

1、屏幕尺寸 (英寸)
屏幕尺寸指屏幕的对角线的长度,单位是英寸(in),1英寸=2.54厘米

链接:英寸(吋)是使用于英国及其前殖民地的长度单位,一般为1in=2.54cm,在英制里,12英寸为1英尺,36英寸为1

2、px (像素)
是英文单词pixel的缩写,意为像素,屏幕上的点。我们通常所说的分辨率如480X800就是指的像素,一般以纵向像素*横向像素。

3、dpi (每英寸点数)
dpi是Dots Per Inch的缩写, 即每英寸包含像素个数。

4、density (屏幕密度)
屏幕密度,density和dpi的关系为 density = dpi/160

4、dp和dip (设备独立像素)

在屏幕密度dpi = 160屏幕上,1dp = 1px。

dp和density的关系为 1dp = density px,

dip值 =(dpi值/160)* pixel值

dip即device independent pixels的缩写,Android特有的单位,

5、sp 
类似dp,一般用来设置字体大小,和dp的区别是它可以根据用户的字体大小偏好来缩放。

二、Android Drawable适配 

1.普通drawable 

drawable-ldpi (dpi=120, density=0.75)

drawable-mdpi (dpi=160, density=1)

drawable-hdpi (dpi=240, density=1.5)

drawable-xhdpi (dpi=320, density=2)

drawable-xxhdpi (dpi=480, density=3)

对于五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 2:3:4:6:8 的比例进行缩放。

我们一般的做法是以高分辨率作为设计大小,然后按照倍数对应缩小到小分辨率的图片。因为小分辨率在生成

高分辨率图片的时候,会出现像素丢失。

1. android项目中那么多以drawable开头的文件夹,那应用的配图应该放在哪个文件夹之下呢?

一般的开发的话,都会做三套配图,对应着drawable-hdpi、drawable-xhdpi、drawable-xxhdpi三个文件夹。

2. 那要是做一套呢?应该做哪一套呢?

做一套也是可以的,放在drawable-xxdpi文件夹中。

3. 为什么做一套配图要放在drawable-xxhdpi文件夹中?

这里先不给出答案,我在网上也看了一些说法,说是省内存,这里暂且不置可否。

同一张图片,放在不同的drawable目录下(从drawable-lpdi到drawable-xxhpdi)在同一手机上占用的内存越来越小。

因为同一部手机,它的densityDpi是固定的,而不同的drawable目录对应的原始密度不同,并且从drawable-lpdi到drawable-xxhpdi原始密度越来越大,而图片的放大倍数=densityDpi÷原始密度,所以放大倍数变小,自然占用的内存小了。

所以如果只有一套配图的话,制作高清大图适配xxhdpi的设备,将配图放置在drawable-xxhdpi目录下就可以了。

三、布局的适配

对于不同的屏幕,如果差别太大,我们就需要使用不同的布局文件,我们可以通过使用配置限定符,在运行时根据当前的设备配置自动选择合适的资源了,例如根据各种屏幕尺寸选择不同的布局。


根据物理尺寸的大小准备5套布局: 
layout(放一些通用布局xml文件,比如界面顶部和底部的布局,不会随着屏幕大小变化,类似windos窗口的title bar)

layout-small(屏幕尺寸小于3英寸左右的布局)

layout-normal(屏幕尺寸小于4.5英寸左右)

layout-large(4英寸-7英寸之间)

layout-xlarge(7-10英寸之间)

四、图标的适配

Android中Logo图的适配,遵循以下要求,适配时要准确的放置对应的mipmap目录下:

  • 36x36 (0.75x) - 低密度 (ldpi)
  • 48x48(1.0x 基准)- 中密度 (mdpi)
  • 72x72 (1.5x) - 高密度 (hdpi)
  • 96x96 (2.0x) - 超高密度 (xhdpi)
  • 144x144 (3.0x) - 超超高密度 (xxhdpi)
  • 192x192 (4.0x) - 超超超高密度 (xxxhdpi)

Android中启动图适配,遵循以下要求,适配时要准确的放置对应的mipmap目录下:

  • 480x800(1.0x 基准)- 中密度 (mdpi)
  • 720x1280 (1.5x) - 高密度 (hdpi)
  • 960x1600 (2.0x) - 超高密度 (xhdpi)
  • 1080x1920 (3.0x) - 超超高密度 (xxhdpi)

Android中通知图标适配,遵循以下要求,适配时要准确的放置对应的mipmap目录下:

  • 24x24(1.0x 基准)- 中密度 (mdpi)
  • 48x48 (1.5x) - 高密度 (hdpi)
  • 72x72 (2.0x) - 超高密度 (xhdpi)
  • 96x96 (3.0x) - 超超高密度 (xxhdpi)

五、适配时的注意点 

1、使用wrap_content、match_parent、weight

weight的计算方法:设置宽度(android:layout_width) + 剩余宽度的占位比

2、使用相对布局,禁用绝对布局

3、使用限定符

4、使用自动拉伸位图--加入.9图

六、使用工具类获取屏幕大小

DisplayMetric metrics=mContext.getResources().getDisplayMetric();

//这两个就是手机屏幕的屏幕分辨率,物理宽高值如1080*1920(ToolBar或ActionBar会占据一定空间,得到的heightPiexls会小一点)
int width = metrics.widthPixels;  // 表示屏幕的像素宽度,单位是px(像素)
int height = metrics.heightPixels;  // 表示屏幕的像素高度,单位是px(像素)

七、dp转px , px转dp

xml资源文件中,我们控制单位可以使用dp来设置,

但在java文件中设置控件的各种长度时使用的单位是像素px,而不是dp;

所以在使用中需要dp到px的转换。

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

疑问:为什么转换时,最后转换结果都需要+0.5f ?

原因:当浮点数转为整型数时,会抛弃小数位,也就是说会向下取整,

出于对计算精度的考虑,需要对结果进行四舍五入,当在结果中加上0.5f后,即可实现四舍五入。

八、mipmap和drawable的区别

mipmap: 专门用于存放应用图标,如:应用的启动图标(Launcher icon),mipmap目录会根据设备的屏幕密度提供相应的图标资源,以确保在不同设备上显示的图标质量和大小适配。

drawable: 存放背景图,按钮图标等,drawable目录下的图像资源不会根据设备屏幕内密度自动缩放,需要手动提供不同分辨率的图像资源,通常情况下,如果不是启动图标,界面UI的图标和图片,可以考虑在drawable目录,例如svg转换的xml图标放在drawable, png的大图需要不同分辨率的图片资源。

总结:

mipmap:放置APP启动图标

drawable:放置应用UI图标

drawable各种dpi的目录: 放置需要不同分辨率的图片,例如启动图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值