| <html devsite><head> |
| <title>实现自适应图标</title> |
| <meta name="project_path" value="/_project.yaml"/> |
| <meta name="book_path" value="/_book.yaml"/> |
| </head> |
| <body> |
| |
| <!-- |
| Copyright 2017 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <p> |
| 如果开发者仅提供一个图标素材资源,自适应图标的形状在设备内会保持一致,但在设备之间会有所差异。此外,图标支持可用于实现动作的两个层(前台和后台),以便为用户提供愉悦的视觉体验。 |
| </p> |
| <p> |
| 设备实现人员会提供一个设备遮罩,该遮罩将决定设备上所有图标的形状。该图标将在任何使用启动器图标(例如,启动器、概览、设置和分享表单)的系统界面上使用。 |
| </p> |
| <h2 id="examples-and-source">示例和源代码</h2> |
| <p> |
| 代码示例:</p><ul> |
| <li><code>platform/development/samples/AdaptiveIconSample/</code></li></ul> |
| <p> |
| |
| 开发者文档: |
| </p><ul> |
| <li><a href="https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive"> |
| https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive</a> |
| </li><li><a href="https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html"> |
| https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html</a> |
| </li><li><a href="https://developer.android.com/reference/android/graphics/drawable/Icon.html#createWithAdaptiveBitmap(android.graphics.Bitmap)"> |
| https://developer.android.com/reference/android/graphics/drawable/Icon.html#createWithAdaptiveBitmap(android.graphics.Bitmap)</a></li></ul> |
| <p> |
| |
| 源代码: |
| </p><ul> |
| <li><code>platform/frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java</code></li></ul> |
| <h2 id="implementation">实现</h2> |
| <p> |
| 要更改平台上图标的形状,请替换 <code>framework/base/core/res/res/values/config.xml</code> 中的一个字符串,如下所示:</p> |
| |
| <pre class="prettyprint"><!-- Specifies the path that is used by AdaptiveIconDrawable class to crop launcher icons. --> |
| <string name="config_icon_mask" translatable="false">"M50,0L100,0 100,100 0,100 0,0z"</string></pre> |
| <p> |
| 该字符串的格式和语法均遵循<a href="https://www.w3.org/TR/SVG/paths.html">路径定义的 W3-SVG 标准</a>。Android 矢量可绘制资源也支持 PathData 的这种格式。 |
| </p> |
| <p> |
| 这个路径应该是上凸的,且应考虑视图边界范围内的安全区 (66/71 = 91%)。此要求在其中一项 CTS 测试中强制执行。 |
| </p> |
| <p> |
| 如果您决定使用圆形作为平台遮罩,请确保也要替换 config_useRoundIcon = true。否则,请将此配置值设为 false 或不指定此配置值。 |
| </p> |
| <h2>自适应图标 API</h2> |
| <p> |
| <code>AdaptiveIconDrawable</code> 类的 API 如下所示:</p> |
| |
| <pre class="prettyprint">package android.graphics.drawable; |
| public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback { |
| method public Drawable getBackground(); |
| method public Drawable getForeground(); |
| method public Path getIconMask(); |
| method public Region getSafeZone(); |
| method public float getExtraInsetFraction(); |
| method public int getOpacity(); |
| method public void invalidateDrawable(Drawable); |
| method public void scheduleDrawable(Drawable, Runnable, long); |
| method public void setAlpha(int); |
| method public void setColorFilter(ColorFilter); |
| method public void setOpacity(int); |
| method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable); |
| }</pre> |
| |
| <pre class="prettyprint">public class Icon extends Parceleable { |
| method public Bitmap createWithAdaptiveBitmap(); |
| }</pre> |
| <h2>参考实现</h2> |
| <p> |
| 无需执行任何操作,即可在任何系统界面上呈现静态自适应图标。当 PackageManager 返回可绘制资源时,只需将它绑定到 ImageView 即可。这就是图标在 Android O 之前版本的平台上呈现的方式。 |
| </p> |
| <p> |
| 关于如何呈现动态动画效果,Launcher3 (platform/packages/apps/Launcher3) 中会提供相应的参考实现来说明如何在 O-MR1 中实现这种效果。 |
| </p> |
| <h2 id="validation">验证</h2> |
| <p> |
| 要验证实现,请在替换其需要的遮罩后,查看图标是否可以在 Launcher3、设置、概览和设置中正确呈现。此外,您还可以在图形 CTS TestCase 中运行 AdaptiveIconDrawableTest.java 和 AdaptiveIconMaskTest.java 来测试实现。 |
| </p> |
| <p> |
| 可以在以下位置找到推荐的手动测试用例:platform/development/samples/AdaptiveIconSample/。 |
| </p> |
| <h2>已知问题</h2> |
| <p> |
| 已知问题包括:</p><ul> |
| <li>图标模糊(取决于遮罩路径的定义方式)。 |
| </li><li>快捷方式图标被放大(如果应用开发者未使用 <code>Icon.createWithAdaptiveBitmap()</code> 方法或未正确使用此方法)。为使此方法正常发挥作用,如果图标是以位图形式传递的,则图标的四边应各保留 25% 的内边距。</li></ul> |
| <p> |
| 这些问题可以通过以下方式解决:</p><ul> |
| <li>应在 [0,100] x [0,100] 坐标系中定义遮罩。 |
| </li><li>确保用于自适应图标(启动器图标、快捷方式)的图片在四侧均保留了充足的内边距 (25%)。</li></ul> |
| |
| </body></html> |