Внедрить адаптивные значки

Адаптивные значки сохраняют единообразную форму внутри устройства, но различаются от устройства к устройству, поскольку разработчик предоставляет только один ресурс значка. Кроме того, значки поддерживают два слоя (передний план и фон), которые можно использовать для движения, чтобы доставить пользователям визуальное удовольствие.

Разработчики устройств предоставляют маску устройства, которая будет определять форму всех значков на устройстве. Этот значок будет использоваться на любых поверхностях системного пользовательского интерфейса, в которых используются значки запуска (например, панель запуска, обзор, настройки и общий доступ).

Примеры и источник

Примеры кода:

  • 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. Если нет, установите это значение конфигурации false или не указывайте это значение конфигурации.

API адаптивных значков

API для класса AdaptiveIconDrawable показан ниже:

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();
   
}

Эталонная реализация

Ничего не нужно делать для отображения статических адаптивных значков на любой из поверхностей системного пользовательского интерфейса. Когда PackageManager возвращает объект рисования, просто привяжите его к ImageView. Именно так иконки уже отображаются на платформах Pre-O.

Что касается рендеринга эффекта динамического движения, Launcher3 (платформа/пакеты/приложения/Launcher3) будет иметь эталонную реализацию, показывающую, как добиться эффекта в O-MR1.

Валидация

Чтобы проверить реализацию, после переопределения маски по своему вкусу проверьте, правильно ли отображаются значки в Launcher3, Настройках, Обзоре и Настройках. Вы также можете запустить AdaptiveIconDrawableTest.java и AdaptiveIconMaskTest.java внутри графического CTS TestCase, чтобы протестировать реализацию.

Рекомендуемый пример ручного тестирования можно найти по адресу: Platform/development/samples/AdaptiveIconSample/.

Известные проблемы

Известные проблемы включают следующее:

  • Размытые значки, в зависимости от того, как определен путь маски.
  • Увеличенные значки ярлыков, если разработчики приложений не используют метод Icon.createWithAdaptiveBitmap() или используют этот метод неправильно. Чтобы этот метод работал правильно, переданное в Bitmap значение должно быть дополнено на 25 % со всех четырех сторон.

Эти проблемы можно решить следующим образом:

  • Маска должна быть определена в системе координат [0, 100] x [0, 100].
  • Убедитесь, что изображения, используемые для адаптивных значков (значки запуска, ярлыки), имеют достаточный отступ (25%) со всех четырех сторон.