在过去,Android应用程序的图标都是应该放到相应的分辨率的mipmap目录下,不过从Android8.0开始,Google已经不再建议使用单一的一张图片来作为应用程序的图标,而是应该使用前景和背景分离的图标设计方式。具体来讲,应用程序的图标应该被分为两层:前景层和背景层。前景层用来展示应用图标的Logo,背景层用来衬托应用图标的Logo。需要注意的是,背景层在设计的时候只允许定义颜色和纹理,不能定义形状。
那么图标的形状由谁来定义呢?Google将这个权利交给手机厂商。手机厂商会在图标的前景层和背景层之上再盖上一层mask。这个mask可以是圆角矩形,圆形或者方形。由具体手机厂商而定,这样就可以将手机上所有应用程序的图标裁剪成相同的形状,从而统一图标的设计规范。
如下两个图片是8.0及以上系统的图标原理示意图。可以看到最终裁剪出的应用程序图标也是圆形的。
裁剪后的应用程序图标。
了解了工作原理我们可以借助AndroidStudio工具来制作能够兼容各个Android系统版本的应用程序图标。点击导航栏中的File->new->Image Asset打开Asset Studio工具。如下图
在Asset Studio中,左边是操作区域,右边是预览区域。
先来看操作区域,第一行的Icon Type保持默认就可以了,表示同时创建兼容8.0系统以及老版本系统的应用图标。第二行的Name用于指定应用图标的名称,这里保持ic_launcher的命名即可。这样可以覆盖掉之前自动生成的应用程序图标。接下来的三个页签,Foreground Layer用于编辑前景层,Background Layer用于编辑背景层,Legacy用于编辑老版本系统的图标。
再来看预览区域,它的作用就是预览应用图标的最终效果。再预览区域中给出了可能生成的图标形状。每个图标都有一个圆圈,这个圆圈叫做安全区域,必须保证图标的前景层完全处于安全区域才行,否则可能会出现应用图标的Logo被手机厂商的mask裁剪掉的情况。
在Foreground Layer中选取之前准备好的那张Logo图片,并通过下方的Resize拖动条对图片进行缩放,以保证前景层的所有内容都在安全区域中的。然后在Background Layer中选择"Color"这种Asset Type模式,并使用#309C78这个颜色值作为背景层的颜色。
在预览部分我们可以看到我们的图标已经能够应对各种不同类型的mask了。
接下来点击“next”会进入一个确认图标生成路径的界面,然后直接点击界面上的“Finish”按钮就可以完成图标的制作了。所有图标相关的文件都会被生成到相应分辨率的mipmap目录下。
其中有一个mipmap-anydpi-v26目录中放的不是图片,而是xml文件,这是什么意思呢?其实只要Android8.0及以上系统的手机,都会使用这个目录下的文件来作为图标。通过打开ic_launcher.xml文件来查看它的代码:
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@color/ic_launcher_background"/> <foreground android:drawable="@mipmap/ic_launcher_foreground"/>adaptive-icon>
这就是适配Android8.0及以上系统应用图标的标准写法。可以看到,这里在< adaptive-icon >标签中定义了一个< background >标签用于指定图标的背景层,引用的是我们之前设置的颜色值。又定义了一个< foreground >标签用于指定图标的前景层,引用的就是我们之前准备的那张logo图。
那么这个ic_launcher.xml文件在哪里被引用呢?其实只要打开AndroidManifest.xml文件
可以看到,< application >标签的android:icon属性就是专门用于指定应用程序图标的,这里将图标指定了@mipmap/ic_launcher,那么在Android8.0及以上系统中,就会使用mipmap-anydpi-v26目录下的ic_launcher.xml文件来作为应用图标。7.0及以上系统就会使用mipmap相应分辨率下的ic_launcher.png图片来作为应用图标。另外你可能会注意到< application >标签下还有一个android:roundIcon属性,这是一个只适用于Android7.1系统的过渡版本,很快就被8.0系统的新图标适配方案所替代了。
运行程序可以看到我们的桌面应用。
来源地址:https://blog.csdn.net/ChenYiRan123456/article/details/130044764