aboutsummaryrefslogtreecommitdiff
path: root/zh-cn/devices/tech/display/adaptive-icons.html
blob: 2c025a601ea78219dace182cae0b9677dd812161 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<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">&lt;!-- Specifies the path that is used by AdaptiveIconDrawable class to crop launcher icons. --&gt;
    &lt;string name="config_icon_mask" translatable="false"&gt;"M50,0L100,0 100,100 0,100 0,0z"&lt;/string&gt;</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>