一、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的目录: 放置需要不同分辨率的图片,例如启动图