적응형 아이콘은 기기 간에 일관성 있는 모양을 유지하지만 이는 기기마다 다르며 개발자가 하나의 아이콘 애셋만 제공합니다. 또한 아이콘은 사용자에게 시각적 즐거움을 제공할 수 있는 두 가지 계층(포그라운드 및 백그라운드)만 지원합니다.
기기 구현자는 기기의 모든 아이콘 모양을 결정하는 기기 마스크를 제공합니다. 이 아이콘은 런처 아이콘을 사용하는 모든 시스템 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%로 충분한지 확인해야 합니다.