적응형 아이콘 구현

적응형 아이콘은 기기 간에 일관성 있는 모양을 유지하지만 이는 기기마다 다르며 개발자가 하나의 아이콘 애셋만 제공합니다. 또한 아이콘은 사용자에게 시각적 즐거움을 제공할 수 있는 두 가지 계층(포그라운드 및 백그라운드)만 지원합니다.

기기 구현자는 기기의 모든 아이콘 모양을 결정하는 기기 마스크를 제공합니다. 이 아이콘은 런처 아이콘을 사용하는 모든 시스템 UI 노출 영역에 사용됩니다(런처, 개요, 설정 및 공유 시트 등).

예시 및 소스

코드 예시:

  • platform/development/samples/AdaptiveIconSample/

개발자 문서:

소스 코드:

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

구현

플랫폼의 아이콘 모양을 변경하려면 다음과 같이 framework/base/core/res/res/values/config.xml에 문자열 한 개를 오버레이합니다.

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

문자열 형식 및 구문은 경로 정의에 관한 W3, SVG 표준을 따릅니다. 이 PathData 형식은 Android 벡터 드로어블도 지원합니다.

이 경로는 컨벡스여야 하며 뷰 경계 내의 세이프존(66/71 = 91%)을 존중해야 합니다. 이는 CTS 테스트 중 하나에서 적용됩니다.

플랫폼 마스크로 원을 사용하기로 결정한 경우에는 config_useRoundIcon = true도 오버레이해야 합니다. 아니면 이 config 값을 false로 설정하거나 config 값을 지정하지 않습니다.

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 플랫폼에서 아이콘이 이미 렌더링된 방식입니다.

동적 모션 효과 렌더링과 관련하여 Launcher3(플랫폼/패키지/앱/Launcher3)은 참조 구현에서 O-MR1의 효과를 달성하는 방법을 보여주도록 합니다.

유효성 검사

구현의 유효성을 검사하려면 원하는 마스크를 재정의한 다음 아이콘이 Launcher3, 설정, 개요 및 설정에서 올바르게 렌더링되는지 확인하세요. 또한 그래픽 CTS TestCase에서 AdaptiveIconDrawableTest.java 및 AdaptiveIconMaskTest.java를 실행하여 구현을 테스트할 수도 있습니다.

수동 테스트 권장 사례는 platform/development/samples/AdaptiveIconSample/에서 찾을 수 있습니다.

알려진 문제

알려진 문제는 다음과 같습니다.

  • 마스크 경로가 정의된 방식에 따른 흐릿한 아이콘
  • 앱 개발자가 Icon.createWithAdaptiveBitmap() 메서드를 사용하지 않거나 이 메서드를 제대로 사용하지 않은 경우에 확대되는 바로가기 아이콘 (이 메서드가 제대로 작동하려면 전달된 비트맵이 네 측면 전부에서 25%로 패딩되어야 함).

이 문제는 다음과 같이 해결할 수 있습니다.

  • 마스크를 [0, 100] x [0, 100] 좌표계에 정의해야 합니다.
  • 적응형 아이콘(런처 아이콘, 바로가기)에 사용된 이미지의 네 측면 패딩이 25%로 충분한지 확인해야 합니다.