Android 8.0 自适应图标

项目中遇到一个问题,Android 8.0 系统上 APP 的 icon 显示的是默认的机器人的 icon,这是什么回事?原来 Android 8.0(API 级别 26)引入了自适应启动器图标,可以在不同设备模型中显示各种形状。下面看下官方酷炫动态图:

图1. 自适应图标支持各种设备之间不同的掩码。

可以通过定义 2 层来控制自适应启动器图标的外观,包括背景和前景。您必须提供图标图层作为可绘图,图标轮廓周围不能有蒙版或背景阴影。

图2. 自适应图标使用 2 个图层和 1 个蒙版进行定义。

在 Android 7.1(API级别25)及更早版本中,启动器图标大小为 48 x 48 dp。必须使用以下准则来调整图标图层的大小:

  • 两层的尺寸必须为 108 x 108 dp。
  • 图标的内部 72 x 72 dp 出现在蒙版视口内。
  • 系统会在四面各留出 18 dp,以产生有趣的视觉效果,如视差或脉冲。

我验证了,不是这些尺寸也是可以的,但我们还是严格按照这个准则来吧。

图3. 自适应图标支持各种视觉效果。

注意: 如果您没有使用必要的图层更新启动器图标,则该图标与系统 UI 显示的其他图标看起来不一致,并且不支持视觉效果。

用 XML 创建自适应图标

我们首先创建一个 Sample 项目,如图:

比以往多一个 res/mipmap-anydpi-v26 文件,打开,有背景和前景。

ic_launcher_background.xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportHeight="108"
    android:viewportWidth="108">
    <path
        android:fillColor="#26A69A"
        android:pathData="M0,0h108v108h-108z" />
    <path
        android:fillColor="#00000000"
        android:pathData="M9,0L9,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
    <!--省略部分代码-->
</vector>

ic_launcher_foreground.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportHeight="108"
    android:viewportWidth="108">
    <path
        android:fillType="evenOdd"
        android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
        android:strokeColor="#00000000"
        android:strokeWidth="1">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endX="78.5885"
                android:endY="90.9159"
                android:startX="48.7653"
                android:startY="61.0927"
                android:type="linear">
                <item
                    android:color="#44000000"
                    android:offset="0.0" />
                <item
                    android:color="#00000000"
                    android:offset="1.0" />
            </gradient>
        </aapt:attr>
    </path>
    <!--省略部分代码-->
</vector>

它们都是 vector,<foreground><background> 是支持android:drawable属性,我直接换成 ic_launcher_background.png 和 ic_launcher_foreground.png,<foreground><background>也支持@color/资源名

<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <!--<background android:drawable="@color/colorAccent" />-->
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

然后清单使用android:icon 属性以指定可绘制资源,还可以使用该android:roundIcon 属性定义图标可绘制资源。

<application
    …
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    …>
</application>

如果要将常规自适应启动器图标应用于快捷方式的相同蒙版和视觉效果,使用以下:

  • 对于静态快捷方式,请使用该<adaptive-icon>元素。
  • 对于动态快捷方式,请在createWithAdaptiveBitmap() 创建方法时调用该 方法。

大功告成,Android 8.0 上能自适应,以下是默认的图标。

注意:Android Studio 3.0 以下的编译器无法找到 adaptive-icon 标签,这点未验证。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Youngxj

给网页添加一个QQ客服悬浮框

49970
来自专栏进击的君君的前端之路

CSS3简介

10640
来自专栏Guangdong Qi

iOS开发常用之UI下拉刷新

51210
来自专栏张善友的专栏

HTML5 canvas图形库RGraph

在新的HTML5标准中,新增了一个非常重要的元素—canvas元素。使用该元素,可以在页面中直接进行各种复杂图形的制作。因此,如果使用该元素绘制统计图,比之前使...

27280
来自专栏葡萄城控件技术团队

用css3制作旋转加载动画的几种方法

以WebKit为核心的浏览器,例如Safari和Chrome,对html5有着很好的支持,在移动平台中这两个浏览器对应的就是IOS和Android。最近在开发一...

31060
来自专栏java一日一条

前端高性能滚动 scroll 及页面渲染优化

最近在研究页面渲染及web动画的性能问题,以及拜读《CSS SECRET》(CSS揭秘)这本大作。

36130
来自专栏前端知识分享

第132天:移动web端-rem布局(进阶)

      该方案使用相当简单,把下面这段已压缩过的 原生JS(仅1kb,源码已在文章底部更新,2017/5/3) 放到 HTML 的 head 标签中即可(注...

23330
来自专栏向治洪

ConstraintLayout约束控件详解

简介 在Google IO大会中不仅仅带来了Android Studio 2.2预览版,同时带给我们一个依赖约束控件–ConstraintLayout。一种构建...

31850
来自专栏练小习的专栏

表格边框你知多少

table之间的边框存在共用问题,自然而然就存在冲突。既然存在冲突,那么就势必涉及到最后渲染哪一个样式的问题。本文就主要研究当冲突产生时,如何让浏览器按照自己意...

23460
来自专栏AndroidTv

一起撸个简单粗暴的Tv应用主界面的网格布局控件(下)

上一篇中我们已经一起学了怎么简单粗暴的撸个支持动态布局的网格控件出来,但在上一篇的介绍中,并没有学习实现网格控件的滑动效果,所以本篇就来讲讲,要如何让我们的网格...

36880

扫码关注云+社区

领取腾讯云代金券