アダプティブ アイコンの実装

アダプティブ アイコンはデバイス内で一貫した形状を維持しますが、デベロッパーから提供される 1 つのアイコン アセットを基にデバイスごとに形状を変えます。さらに、ユーザーが視覚的に楽しめるモーションを付加できるよう、それに使用する 2 つのレイヤ(前景と背景)をサポートしています。

デバイスの実装者は、デバイス上のすべてのアイコンの形状を決定するデバイスマスクを提供します。このアイコンは、ランチャー アイコンを使用する任意のシステム UI サーフェス(例: ランチャー、最近、設定、共有シート)で使用されます。

例とソース

コード例:

  • platform/development/samples/AdaptiveIconSample/

デベロッパー向けドキュメント

ソースコード:

  • platform/frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java

実装

プラットフォーム上のアイコンの形状を変更するには、framework/base/core/res/res/values/config.xml の 1 つの文字列を次のようにオーバーレイします。

<!-- 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>

文字列の形式と構文は、W3C による SVG 標準のパス定義に従います。PathData のこの形式は、Android ベクター型ドローアブルでもサポートされています。

このパスは凸形状で、ビュー境界内のセーフゾーン(66/71 = 91%)を確保する必要があります。これは、CTS テストで強制適用されます。

サークルをプラットフォームのマスクとして使用する場合は、config_useRoundIcon = true もオーバーレイする必要があります。使用しない場合は、この構成値を false に設定するか、この構成値を指定しないでください。

Adaptive Icon API

AdaptiveIconDrawable クラスの API は次のとおりです。

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);
    }
public class Icon extends Parceleable {
    method public Bitmap createWithAdaptiveBitmap();
    }

リファレンス実装

システム UI サーフェス上の静的なアダプティブ アイコンをレンダリングするために必要な操作はありません。PackageManager がドローアブルを返す場合は、単に ImageView にバインドします。このようにして、Pre-O プラットフォームでアイコンはレンダリングされます。

動的モーション効果のレンダリングについては、O-MR1 でその効果を実現する方法を示したリファレンス実装が、Launcher3(platform/packages/apps/Launcher3)に用意されます。

検証

実装を検証するには、目的のマスクをオーバーライドした後に、Launcher3、設定、最近および設定で、アイコンが正しくレンダリングされるかどうかを確認します。 また、グラフィックの CTS TestCase で、AdaptiveIconDrawableTest.java と AdaptiveIconMaskTest.java を実行して実装をテストすることもできます。

推奨の手動テストケースについては、platform/development/samples/AdaptiveIconSample/ をご覧ください。

既知の問題

既知の問題には次のものがあります。

  • マスクパスの定義方法によってアイコンが不鮮明になる。
  • アプリ デベロッパーが Icon.createWithAdaptiveBitmap() メソッドを使用しない、またはこのメソッドを適切に使用していない場合にショートカット アイコンが拡大される。このメソッドを正しく機能させるには、渡されたビットマップの上下左右に 25% のパディングが必要です。

これらの問題は次のように解決できます。

  • マスクは [0, 100] x [0, 100] 座標系で定義する必要があります。
  • アダプティブ アイコンに使用する画像(ランチャー アイコン、ショートカット)の上下左右に十分なパディング(25%)があることを確認します。