参考:Android开发使用mipmap文件夹的正确姿势: px 、dpi 、dp
软件图标的适配
系统会优先选用
android:roundIcon="@mipmap/ic_img"
属性对应的图片
测试的在华为手机Android 9.0系统中,但是在切换targetSdkVersion
大于26和小于26的时候,并没有对图标进行原型切换,26前后对应的图标形状一样。可能是华为对这部分源码进行了修改,将mask层修改为圆角矩形。
在pixel2手机上的图标效果,切换
targetSdkVersion
大于26和小于26的时候显示效果都是一样的。如下图:
mipmap
中几个文件夹的认识
mipmap
中的文件夹分别为
mipmap-lhdpi
mipmap-mdpi
mipmap-hdpi
mipmap-xhdpi
mipmap-xxhdpi
mipmap-xxxhdpi
新创建的项目都会有这几个文件夹,那么这几个文件夹是怎样的呢?内部的规则是什么呢?都是怎样对应的呢?
讲解这些之前我们需要知道我们平常见到的一些尺寸单位的关系:
- px 像素点
- dpi 每一英寸像素点的密度。(看到dpi了,mipmap中的文件夹好像都以dpi结尾,应该是有点关系的)
- dp 设备无关像素,可以说是根据dpi的不同而不同;
- pt
1pt=1/72 in
(in是英寸) 1pt相当于1/72英寸- sp 文字使用的单位,与设备硬件有关
px
(像素点)和dpi
(像素单位密度)之间的换算公式是:
像素密度=√{(长度像素数^2 + 宽度像素数^2)}/ 屏幕尺寸
px,dpi
和dp
之间关系:
每一个设备的
dpi
是固定的,但是Android
的机型太多了,每个机型都可能有自己的dpi
,我们在换算这三个单位的时候是以160
为基准的。比如说当dpi
为160
的话,那么1px=1dp
;如果dpi
为320
的话,1px=0.5dp
。它们之间的换算公式为px=dp*(dpi/160)
上边一些尺寸的基础知识,感觉很乱啊。。。
接下来就将一下mipmap
下边几个文件夹的关系 表1-1:
mipmap-lhdpi | mipmap-mdpi | mipmap-hdpi | mipmap-xhdpi | mipmap-xxhdpi | mipmap-xxxhdpi | |
---|---|---|---|---|---|---|
dpi范围 | (0-120]dpi | (120-160]dpi | (160-240]dpi | (240-320]dpi | (320-480]dpi | (480-640]dpi |
1dp对应px(luffy) | 0.75 | 1 | 1.5 | 2 | 3 | 4 |
上边dp
对应px
的比值我起名为(luffy)
。
我们在开发的过程中,对图片的展示通常就两种:固定宽高,不固定宽高。
固定宽高会遇到的问题是放置的图片可能会模糊;不固定宽高可能就会和自己想要的尺寸不一样了。
我现在以不固定宽高的来说,比如给一个TextView
设置dropLeft
,这样就不能设置宽高,那么ui
给的图片我到底该放置到哪个dpi
文件夹里边才合适呢。因为我开发的是特定机器上的app
,所以只需要一个mipmap
文件夹就行了。
我现在将一张32 * 32
的图片分别放到这六个文件夹里边,不固定尺寸的显示图片,并通过方法获取图片的宽高,测试机器的dpi
是480
。
记住两个数据:图片尺寸是32 * 32
;测试机是480dpi
。
结果如下 表1-2:
mipmap-lhdpi | mipmap-mdpi | mipmap-hdpi | mipmap-xhdpi | mipmap-xxhdpi | mipmap-xxxhdpi | |
---|---|---|---|---|---|---|
dpi范围 | (0-120]dpi | (120-160]dpi | (160-240]dpi | (240-320]dpi | (320-480]dpi | (480-640]dpi |
1dp对应px(luffy) | 0.75 | 1 | 1.5 | 2 | 3 | 4 |
图片展示宽高(px) | 128*128 | 96*96 | 64*64 | 48*48 | 32*32 | 24*24 |
结果是同一张图片放到不同的文件夹中,显示的尺寸是不一样的,因为测试机是480dpi
,对应的本命mipmap
文件夹是mipmap-xxhdpi
,所以这个文件夹中的图片在这个测试机上都会原尺寸显示。其他的文件夹中的图片都会根据1-2表格中的dp
和px的换算比例进行换算。比如,1-2表中mipmap-xxhdpi
对应的luffy
是3
,mipmap-hdpi
的luffy
值是1.5
,如果我们将32 * 32
的图片放到mipmap-hdpi
文件夹中,其他文件夹中不放置,软件展示图片的时候就会获取mipmap-hdpi
文件夹中的图片,显示的效果我们知道是64 * 64
,再看对应着刚说的luffy
值,是不是看出点什么?好像不同文件夹中的图片显示的效果和luffy值有关啊。
(图片真实尺寸*测试机对应的本命mipmap文件夹中的luffy值)/当前mipmap文件夹中的luffy值=显示到屏幕上的尺寸
比如 ,当将图片放置到mipmap-hdpi 文件夹中:
(32 * 3)/1.5=64
其中32
为图片尺寸,3
为当前我是用的测试机的luffy
值,1.5
为mipmap-hdpi
的luffy
值。
那么如果我们想不管从哪个文件夹获取图片,展示的都是32*32
,那好说啊,按照这个公式,获取不同文件夹中需要放置的图片尺寸。比如mipmap-hdpi
放置16 * 16
的图片,就可以在我的测试机上展示32 * 32
的效果了。
声明一下,手机上的app开发没有这个需求,我只是找出这几个文件夹中的关系。
我上边一直说的展示尺寸都是px
,那么在不同的机器上同时展示32 * 32
的效果,根据上边的公式可以实现,但是展示的效果肯定各不相同。
上边的需求是我在做特定机器时,只有一种分辨率,一种dpi
,那我想把所有mipmap
文件夹都塞满,而且展示的效果都一样,就需要上边的公式。
手机上mipmap文件夹中图片放置规则
当手机上不同的机器,不同的dpi
展示同一种效果时,也就是占用屏幕相同的比例时,那表示这个效果的值就是dp
,相同的dp
在不同的机器上展示的效果基本相同,比如我想在480dpi
的机器上展示的效果要和320dpi
一样,那就需要它们展示的dp
一样,我们展示一个32dp*32dp
的图片。根据公式: px=dp*(dpi/160)
可以得到 32 * luffy=?px
;那么480dpi
对应的luffy
值是3
,所以480dpi
对应的mipmap
中的图片尺寸是96px * 96px
,320dpi
对应的mipmap
中的尺寸是64 * 64
。
要在不同的机器上展示32dp*32dp
的图片一张表格展示: 1-3
mipmap-lhdpi | mipmap-mdpi | mipmap-hdpi | mipmap-xhdpi | mipmap-xxhdpi | mipmap-xxxhdpi | |
---|---|---|---|---|---|---|
dpi范围 | (0-120]dpi | (120-160]dpi | (160-240]dpi | (240-320]dpi | (320-480]dpi | (480-640]dpi |
1dp对应px(luffy) | 0.75 | 1 | 1.5 | 2 | 3 | 4 |
所需图片的尺寸(px) | 24*24 | 32*32 | 48*48 | 64*64 | 96*96 | 128*128 |
其他dp
的图片都可以按照这个规则展示。
mipmap
文件夹图片优先使用规则
当合适的mipmap
文件夹中没有对应的图片的时候,会优先往高的找,会优先找最近的