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

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

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

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

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

  • 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%) со всех четырех сторон.