Os ícones adaptáveis mantêm uma forma consistente no dispositivo, mas variam de um dispositivo para o outro com apenas um recurso de ícone fornecido pelo desenvolvedor. Além disso, os ícones oferecem suporte a duas camadas (primeiro e segundo planos) que podem ser usadas para oferecer uma experiência mais bonita aos usuários.
Os implementadores de dispositivos fornecem uma máscara que vai decidir a forma de todos os ícones em um dispositivo. Esse ícone será usado em todas as plataformas da interface do sistema que usam ícones na tela de início, (por exemplo, tela de início, visão geral, configurações e página de compartilhamento).
Exemplos e origem
Exemplos de código:
platform/development/samples/AdaptiveIconSample/
Documentação para desenvolvedores:
Código-fonte:
platform/frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
Implementação
Para mudar 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 de PathData é compatível com drawables vetoriais do Android.
Esse caminho precisa ser convexo e respeitar a zona segura (66/71 = 91%) dentro dos limites da visualização. Isso é aplicado em um dos testes do CTS.
Se você decidir usar um círculo como máscara da plataforma, também aplique config_useRoundIcon = true. Caso contrário, defina esse valor de configuração como falso ou não especifique esse valor.
API Adaptive Icon
A API da 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
Não é necessário fazer nada para renderizar os ícones adaptativos estáticos em nenhuma das plataformas da interface do sistema. Quando o PackageManager retornar um drawable, simplesmente associe-o a uma ImageView. É assim que os ícones são renderizados em 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 alcançar o efeito no O-MR1.
Validação
Para validar a implementação, depois de substituir a máscara de preferência, verifique 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 TestCase do CTS de gráficos 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:
- Ícones desfocados, dependendo de como o caminho da máscara é definido.
- Ícones de atalho com zoom se os desenvolvedores de apps não usarem o
método
Icon.createWithAdaptiveBitmap()
ou não o usarem corretamente. Para que esse método funcione corretamente, o bitmap transmitido precisa ser preenchido em 25% nos quatro lados.
Esses problemas podem ser resolvidos da seguinte maneira:
- A máscara precisa ser definida no sistema de coordenadas [0, 100] x [0, 100].
- Confira se as imagens usadas para ícones adaptativos (ícones da tela de início , atalhos) têm padding suficiente (25%) nos quatro lados.