Android 项目中软件图标适配和mipmap文件夹的规则

参考:Android开发使用mipmap文件夹的正确姿势: px 、dpi 、dp

软件图标的适配

Android应用图标微技巧,8.0系统中应用图标的适配

系统会优先选用android:roundIcon="@mipmap/ic_img"属性对应的图片

测试的在华为手机Android 9.0系统中,但是在切换targetSdkVersion 大于26和小于26的时候,并没有对图标进行原型切换,26前后对应的图标形状一样。可能是华为对这部分源码进行了修改,将mask层修改为圆角矩形。

图标

在pixel2手机上的图标效果,切换targetSdkVersion 大于26和小于26的时候显示效果都是一样的。如下图:
image.png

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,dpidp之间关系:

每一个设备的dpi是固定的,但是Android的机型太多了,每个机型都可能有自己的dpi,我们在换算这三个单位的时候是以160为基准的。比如说当dpi160的话,那么1px=1dp;如果dpi320的话,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的图片分别放到这六个文件夹里边,不固定尺寸的显示图片,并通过方法获取图片的宽高,测试机器的dpi480
记住两个数据:图片尺寸是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对应的luffy3mipmap-hdpiluffy值是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.5mipmap-hdpiluffy值。

那么如果我们想不管从哪个文件夹获取图片,展示的都是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文件夹中没有对应的图片的时候,会优先往高的找,会优先找最近的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。