Implementação de ícones adaptáveis

Os Adaptive Icons mantêm uma forma consistente dentro do dispositivo, mas variam de dispositivo para dispositivo com apenas um ativo de ícone fornecido pelo desenvolvedor. Além disso, os ícones suportam duas camadas (primeiro plano e plano de fundo) que podem ser usadas para movimento para proporcionar prazer visual aos usuários.

Os implementadores de dispositivos fornecem uma máscara de dispositivo que decidirá a forma de todos os ícones em um dispositivo. Esse ícone será usado em qualquer superfície de interface do usuário do sistema que use ícones do iniciador (por exemplo, iniciador, visão geral, configurações e planilha de compartilhamento).

Exemplos e fonte

Exemplos de código:

  • platform/development/samples/AdaptiveIconSample/

Documentação do desenvolvedor:

Código fonte:

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

Implementação

Para alterar a forma do ícone em uma plataforma, sobreponha uma string em framework/base/core/res/res/values/config.xml , da seguinte maneira:

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

O formato e a sintaxe da string seguem o padrão W3, SVG para definição de caminho . Esse formato para PathData também é compatível com os drawables vetoriais do Android.

Este caminho deve ser convexo e deve respeitar a zona segura (66/71 = 91%) dentro dos limites da visualização. Isso é aplicado em um dos testes CTS.

Se você decidir usar um círculo como a máscara da plataforma, certifique-se de sobrepor também config_useRoundIcon = true. Caso contrário, defina esse valor de configuração como false ou não especifique esse valor de configuração.

API de ícones adaptáveis

A API para a classe AdaptiveIconDrawable é mostrada abaixo:

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

Implementação de referência

Nada precisa ser feito para renderizar os ícones adaptativos estáticos em qualquer uma das superfícies da interface do usuário do sistema. Quando PackageManager retornar um drawable, simplesmente vincule-o a um ImageView. É assim que os ícones já são renderizados nas plataformas Pre-O.

Em relação à renderização do efeito de movimento dinâmico, o Launcher3 (platform/packages/apps/Launcher3) terá uma implementação de referência mostrando como obter o efeito no O-MR1.

Validação

Para validar a implementação, após substituir a máscara de sua preferência, veja se os ícones são renderizados corretamente no Launcher3, Configurações, Visão geral e Configurações. Você também pode executar AdaptiveIconDrawableTest.java e AdaptiveIconMaskTest.java dentro de gráficos CTS TestCase para testar a implementação.

Um caso de teste manual recomendado pode ser encontrado em: platform/development/samples/AdaptiveIconSample/.

Problemas conhecidos

Os problemas conhecidos incluem o seguinte:

  • Ícones desfocados, dependendo de como o caminho da máscara é definido.
  • Ícones de atalho ampliados se os desenvolvedores de aplicativos não usarem o método Icon.createWithAdaptiveBitmap() ou não usarem esse método corretamente. Para que este método funcione corretamente, o Bitmap passado deve ser preenchido 25% em todos os quatro lados.

Essas questões podem ser tratadas da seguinte forma:

  • A máscara deve ser definida no sistema de coordenadas [0, 100] x [0, 100].
  • Certifique-se de que as imagens usadas para ícones adaptáveis ​​(ícones do iniciador, atalhos) tenham preenchimento suficiente (25%) nos quatro lados.