Implementar ícones adaptativos

Os ícones adaptativos 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 fundo) que podem ser usadas para movimento para proporcionar deleite 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. Este ícone será usado em qualquer interface de interface 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 , como segue:

<!-- 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 . Este formato para PathData é o que os drawables vetoriais do Android também suportam.

Este caminho deve ser convexo e 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 máscara de plataforma, certifique-se de sobrepor também config_useRoundIcon = true. Caso contrário, defina esse valor de configuração como falso ou não especifique esse valor de configuração.

API de ícone adaptável

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 UI do sistema. Quando o PackageManager retornar um drawable, basta vinculá-lo a um ImageView. É assim que os ícones já são renderizados nas plataformas Pré-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 do CTS TestCase gráfico 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 está 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 com 25% em todos os quatro lados.

Essas questões podem ser abordadas 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 adaptativos (ícones de inicialização, atalhos) tenham preenchimento suficiente (25%) em todos os quatro lados.