安卓自适应图标 AdaptiveIconDrawable

前言

我是一个安卓开发小白,这学期学习了有关Android Studio开发的相关内容,为此,我对应用程序的图标很感兴趣,这里,我将介绍我新学习的有关安卓开发自适应图标的内容。
 

自适应图标


自适应图标,或 AdaptiveIconDrawable 、 显示的内容可能因具体设备功能和用户而异 主题。自适应图标主要由主屏幕上的启动器使用, 但也可用于快捷方式、“设置”应用、共享对话框和 概览屏幕。自适应图标适用于所有 Android 设备类型。

与位图相比 图片,自适应图标 以适应不同的应用场景:

  • 不同的形状:自适应图标可以显示各种形状 在不同型号的设备上例如,它可以显示 并显示一个方圆形(方形和 圈子)。每个设备的原始设备制造商 (OEM) 都必须提供蒙版, 系统使用 来渲染具有相同形状的所有自适应图标。
                                            一张 GIF 图片,显示了同一示例 Android 图标的重复动画; 根据使用的蒙版显示不同的形状 - 一个圆圈,然后是一个圆圈 两种不同的弧形

                                       图1.自适应图标支持多种 口罩(因设备而异)


                                           ​​​GIF 图片,显示了两个圆形 Android 示例图标示例,以动画形式显示用户响应第一个图标显示了在圆圈内先向左再向右再上下摆动第二个图标会展开,然后再次收缩。

                                                图 2. 视觉效果示例 自适应图标

  • 用户主题设置:从 Android 13(API 级别 33)开始,用户可以设置主题 自适应图标。如果用户通过打开 系统设置中的带主题的图标切换开关,启动器支持此功能 功能时,系统会使用用户所选壁纸的颜色,并 主题来确定色调颜色。


    一张图片,显示了三台 Android 设备的示例,每台设备显示了一个 色调不同的不同用户主题:第一张显示壁纸 着色较暗;第二个是金色壁纸第三个显示的是 浅灰色和蓝色调的壁纸。在每个示例中, 图标沿用了壁纸的色调,并完美地与主题融为一体。


                                                      图 3. 从 用户的壁纸和主题​
     

    在以下情况下,主屏幕不会显示主题 应用图标,而改为显示自适应或标准应用图标:

    • 如果用户未启用带主题的应用图标。

    • 如果您的应用未提供单色应用图标。

    • 如果启动器不支持带主题的应用图标。​

设计自适应图标

为确保自适应图标支持不同的形状、视觉效果和 用户主题设置,则设计必须符合以下要求:

  • 您必须为图标的彩色版本提供两个图层:一个用于 另一个用于后台。这些图层可以是矢量,也可以是 但最好使用矢量

显示前景图层(左侧图片)和 背景层(右图)。前景显示了 16 面的图标, 示例 Android 徽标,位于 66x66 安全区域的中心。安全区是 居中放置在 108x108 容器内。背景显示的内容 但只能看到蓝色的 背景没有徽标。

                                          图 4. 使用前景定义的自适应图标 和背景层。

一张图片,显示前一张图片中的图标叠加在 圆形蒙版

                                    图 5.前景和 应用圆形蒙版后,背景图层可以一起显示。

  • 如果您希望支持应用图标的用户主题设置,请提供一个图层, 单色版本的图标。

<ph type="x-smartling-placeholder">

</ph>

显示单色图标图层示例的图片(左侧图片) 和颜色预览(右图)。单色图层显示了 16 面 示例 Android 徽标的图标,位于 66x66 安全区域的中心。保险箱 区域中心位于 108x108 容器内。颜色预览会显示 该图层在应用到不同颜色的用户主题(橙色、 粉色、黄色和绿色)。

                                  图 6.一个单色图标层(左侧), 颜色预览示例(右)

  • 将所有层的大小调整为 108x108dp。

  • 使用边缘简洁的图标。图层不得有蒙版或背景 阴影。

  • 四条边外侧的 18dp 分别是 以及创建视差或脉冲等视觉效果。

  • 使用尺寸至少为 48x48 dp 的徽标。尺寸不得超过 66x66dp, 因为图标的内部 66x66 dp 显示在遮罩内 视口。


代码实现

以上内容来自安卓开发者,接下来我将在Android内实现关于安卓的自适应图标内容。

与非自适应图标一样,自适应图标也使用应用中的android:icon属性清单。

可选属性android:roundIcon,由表示启动器使用 带有圆形图标的应用,如果您的应用的图标包含圆形图标, 圆形背景作为其设计的核心部分。此类启动器必须 通过对android:roundIcon应用圆形蒙版来生成应用图标, 让您能够优化应用图标的外观, 将徽标略微放大,并确保在剪裁后 则是全宽背景

以下代码段说明了这两个属性 仅指定 android:icon:

<think>嗯,用户问的是Android系统源码中的桌面图标形状。我需要先回忆一下Android系统在这方面的处理机制。首先,Android的桌面属于Launcher应用的一部分,而不同的设备厂商可能有自己的定制Launcher,比如小米的MIUI、华为的EMUI等。这些厂商通常会修改Launcher的源码来自定义图标形状。 接下来,图标形状的控制可能涉及多个方面。比如,系统默认的图标形状可能在某个资源文件中定义,或者在运行时根据主题动态调整。我记得Android 8.0(API 26)引入了自适应图标(Adaptive Icons),允许开发者提供不同形状的图标,而系统会根据设备设置来裁剪显示。这可能是在framework/base的某个部分处理的,比如在IconLoader或者Launcher3的代码里。 然后,用户可能需要知道如何查找相关的源码。我应该建议他们查看AOSP中的packages/apps/Launcher3模块,特别是处理图标绘制的部分,比如IconCache或BubbleTextView。另外,资源文件中的图标形状可能引用了XML定义的形状,比如在res/drawable目录下的某个文件,使用了<shape>标签。 还需要考虑不同Android版本之间的差异。比如在Android 8.0之前,图标形状可能由Launcher直接控制,之后则使用自适应图标。此外,系统主题也可能影响图标形状,用户可能通过系统设置更改图标风格,这涉及到主题引擎和资源叠加机制(Overlay)。 另外,厂商自定义的部分可能需要查看厂商的Launcher源码,这部分通常不在AOSP中。不过用户如果只是想了解原生Android的实现,可以专注于AOSP的Launcher3和相关类。例如,AdaptiveIconDrawable类负责处理自适应图标的绘制和裁剪路径。 总结一下,回答应该分步骤说明Android如何处理桌面图标形状,涉及的关键类和资源文件,以及不同版本和厂商的影响。同时需要指导用户如何查找相关源码,并提到自适应图标的概念和实现方式。</think>在 Android 系统源码中,桌面图标形状的控制主要涉及以下核心模块和机制: $\boxed{\text{关键实现步骤解析}}$ 1. $\text{Launcher3 模块}$ - 路径:`packages/apps/Launcher3` - 原生 Android 的桌面实现模块 - 核心类: - `BubbleTextView`:负责图标渲染 - `IconCache`:管理图标缓存 - `AdaptiveIconDrawable`:处理自适应图标形状 2. $\text{形状控制机制}$ ```java // 代码示例:Launcher3 的图标形状配置 <!-- res/values/config.xml --> <resources> <item name="default_icon_mask" format="path">@string/icon_mask</item> </resources> <!-- res/values/strings.xml --> <string name="icon_mask" translatable="false">M50,0L100,50 L50,100 L0,50 L50,0</string> ``` 通过 SVG path 定义蒙版形状,默认正方形路径为 `M50,0L100,50 L50,100 L0,50 L50,0` 3. $\text{自适应图标 (API 26+)}$ ```xml <!-- AndroidManifest.xml --> <application android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round"> ``` 系统通过 `AdaptiveIconDrawable` 实现动态裁剪: $$\text{最终形状} = \text{系统蒙版} \otimes (\text{前景层} \oplus \text{背景层})$$ 4. $\text{系统级重写方法}$ ```java // 在 DeviceDefault 主题中重写 <style name="Theme.DeviceDefault"> <item name="android:windowIconMask">@drawable/icon_mask_override</item> </style> ``` 设备厂商通过 overlay 机制覆盖 `config_icon_mask` 实现定制 $\boxed{\text{不同实现方案对比}}$ | 方案类型 | 实现路径 | 影响范围 | 兼容性要求 | |-----------------|-----------------------------------|----------------|-------------| | 原生配置 | packages/apps/Launcher3 | 仅 AOSP 桌面 | API 26+ | | 系统主题覆盖 | frameworks/base/core/res | 全局生效 | 需要 root | | 厂商自定义 | vendor/xxx/overlay/Launcher3 | 特定设备 | 依赖 ROM | $\boxed{\text{调试技巧}}$ - 使用命令 `adb shell setprop debug.layout true` 查看图标蒙版边界 - 在开发者选项中开启「强制启用桌面图标蒙版」 - 通过 `dumpsys activity service com.android.launcher3` 获取当前配置 建议通过 AOSP 代码搜索以下关键符号进行深入分析: $$\text{ICON\_MASK\_RESOURCE} \in \text{IconLoader.java}$$ $$\text{SHAPE\_PATH} \in \text{AdaptiveIconDrawable.java}$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值