Реализация адаптивных значков

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

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

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

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

  • 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() или используют этот метод неправильно. Чтобы этот метод работал правильно, передаваемый битмап должен быть заполнен на 25% со всех четырех сторон.

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

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