Desde o Android 4.3 (Jelly Bean), agora podemos fazer uso das res/mipmap
pastas para armazenar imagens "mipmap".
Por exemplo, o Chrome para Android armazena seus ícones nessas pastas em vez das res/drawable
pastas mais normais .
Como essas imagens mipmap são diferentes das outras imagens desenháveis familiares?
Vejo que, no meu manifesto, usamos o @mipmap/
qualificador, em vez de @drawable/
, o que faz sentido, considerando o nome da pasta do recurso:
<activity
android:name=".MipmapDemp"
android:icon="@mipmap/ic_launcher" />
Referências:
O documento APIs do Android 4.3 tem o seguinte a dizer:
Usar um mipmap como fonte para seu bitmap ou desenho é uma maneira simples de fornecer uma imagem de qualidade e várias escalas de imagem, o que pode ser particularmente útil se você espera que sua imagem seja dimensionada durante uma animação.
O Android 4.2 (API nível 17) adicionou suporte para mipmaps na classe Bitmap - o Android troca as imagens mip no seu Bitmap quando você fornece uma fonte de mipmap e ativou setHasMipMap (). Agora no Android 4.3, você também pode ativar os mipmaps para um objeto BitmapDrawable, fornecendo um ativo mipmap e definindo o atributo android: mipMap em um arquivo de recurso de bitmap ou chamando hasMipMap ().
Não vejo nada lá que me ajude a entender.
Os recursos de bitmap XML têm uma android:mipMap
propriedade:
Boleano. Ativa ou desativa a dica do mipmap. Veja setHasMipMap () para mais informações. O valor padrão é falso.
Isso não se aplica aos ícones do iniciador, tanto quanto eu posso ver.
A questão foi levantada nos Grupos do Google ( O objetivo do nome do recurso "mipmap" ?! ), ao qual Romain Guy respondeu:
É útil fornecer uma imagem em uma resolução maior que normalmente seria computada (por exemplo, em um dispositivo mdpi, o Launcher pode querer que o ícone maior do hdpi exiba atalhos de aplicativos grandes.)
Eu sinto que isso quase faz sentido, mas não completamente.
Ainda estou inclinado a acompanhar o acompanhamento de Randy Sugianto:
Quais são as vantagens disso? Existe algum guia sobre como usar mipmaps, provavelmente para melhores ícones do iniciador?
Obviamente, a Wikipedia possui uma página para o "Mipmap" , que se refere a uma técnica mais antiga inventada em 1983, que não consigo relacionar com a implementação atual do Android.
Atualmente, devemos armazenar todos os ícones de aplicativos em res/mipmap
pastas e quais são as diretrizes para essas imagens mipmap?
Atualização # 1
Aqui está uma postagem no blog que tenta explicar um pouco.
Mas a imagem usada nessa postagem do blog mostra o que parece um arquivo com muitos logotipos. Não é isso que vejo na pasta mipmap do Chrome.
A mipmap-hdpi
pasta do Chrome contém três imagens. Um é o logotipo do Chrome, por si só.
Estranhamente, é 72x72, não 48x48, que eu esperaria ver.
Talvez isso seja tudo o que há para isso - precisamos apenas manter ícones maiores nas pastas mipmap?
Atualização # 2
A postagem do blog de desenvolvedores do Android de 23/10/2014 confirma novamente a ideia de usar as mipmap
pastas para os ícones de aplicativos:
Ao falar sobre a densidade da tela do Nexus 6, o autor escreve:
É uma prática recomendada colocar os ícones do seu aplicativo em pastas mipmap (não nas pastas desenháveis), pois elas são usadas em resoluções diferentes da densidade atual do dispositivo. Por exemplo, um ícone de aplicativo xxxhdpi pode ser usado no iniciador para um dispositivo xxhdpi.
Atualização # 3
Observe que o Android Studio cria os ic_launcher.png
ícones nas mipmap...
pastas, e não nas drawable...
pastas que o Eclipse usou para criá-los.
fonte
Parece que o Google atualizou seus documentos desde todas essas respostas, então espero que isso ajude outra pessoa no futuro :) Acabei de me deparar com essa pergunta enquanto criava um novo (novo) novo projeto.
TL; DR: os drawables podem ser removidos como parte da otimização de recursos específicos do dp. Os mipmaps não serão removidos.
(em http://developer.android.com/tools/projects/index.html#mipmap )
fonte
Aqui estão meus dois centavos na tentativa de explicar a diferença. Há dois casos com os quais você lida ao trabalhar com imagens no Android:
Você deseja carregar uma imagem para a densidade do seu dispositivo e usá-la "como está", sem alterar o tamanho real . Nesse caso, você deve trabalhar com desenháveis e o Android fornecerá a imagem mais adequada.
Você deseja carregar uma imagem para a densidade do seu dispositivo, mas essa imagem será ampliada ou reduzida . Por exemplo, isso é necessário quando você deseja mostrar um ícone maior do iniciador ou se tem uma animação que aumenta o tamanho da imagem. Nesses casos, para garantir a melhor qualidade de imagem, você deve colocar sua imagem na pasta mipmap . O que o Android fará é tentar capturar a imagem de um balde de maior densidade em vez de aumentá-la. Isso aumentará a nitidez (qualidade) da imagem.
Assim, a regra geral para decidir onde colocar sua imagem seria:
fonte
A implementação Android dos mipmaps na versão 4.3 é exatamente a técnica de 1983 explicada no artigo da Wikipedia :)
Embora isso seja descrito como uma técnica para gráficos 3D (como menciona "visualização à distância"), também se aplica ao 2D (traduzido como "desenhado é um espaço menor", ou seja, "redimensionado").
Para um exemplo concreto do Android, imagine que você tenha uma View com um determinado background desenhável (em particular, a
BitmapDrawable
). Agora você usa uma animação para dimensioná-la para 0,15 do tamanho original. Normalmente, isso exigiria a redução do tamanho do bitmap de segundo plano para cada quadro. Essa redução "extrema", no entanto, pode produzir artefatos visuais.Você pode, no entanto, fornecer um mapa mip, o que significa que a imagem já está pré-renderizada para algumas escalas específicas (digamos 1.0, 0.5 e 0.25). Sempre que a animação "ultrapassar" o limite de 0,5, em vez de continuar diminuindo a escala da imagem original de tamanho 1,0, ela será alterada para a imagem 0,5 e diminuída, o que deverá fornecer um resultado melhor. E assim por diante enquanto a animação continua.
Isso é um pouco teórico, pois é realmente feito pelo renderizador. De acordo com a fonte da classe Bitmap, é apenas uma dica, e o renderizador pode ou não respeitá-la.
Não sei ao certo por que isso seria especialmente adequado para ícones de aplicativos. Embora o Android em tablets, assim como alguns lançadores (por exemplo, GEL), solicite um ícone "uma densidade mais alta" para mostrá-lo maior, isso deve ser feito usando o mecanismo regular (ou seja
drawable-xxxhdpi
, etc.).fonte
drawable
pastas que também contêm imagens mipmap.drawable-nostrip
ou algo assim.https://plus.google.com/105051985738280261832/posts/QTA9McYan1L
fonte
Como estava procurando uma resposta esclarecedora para determinar o tipo certo de ícones de notificação, gostaria de adicionar esta declaração clara ao tópico. É de http://developer.android.com/tools/help/image-asset-studio.html#saving
fonte
Ao criar apks separados para diferentes densidades, as pastas desenháveis para outras densidades são removidas. Isso fará com que os ícones pareçam embaçados em dispositivos que usam ícones do iniciador de maior densidade. Como as pastas mipmap não são removidas, é sempre melhor usá-las para incluir os ícones do iniciador.
fonte
Citação deste artigo.
fonte
MipMap para ícone do aplicativo para iniciador
http://android-developers.blogspot.co.uk/2014/10/getting-your-apps-ready-for-nexus-6-and.html
https://androidbycode.wordpress.com/2015/02/14/goodbye-launcher-drawables-hello-mipmaps/
fonte
drawable-XXX
e asmipmap-XXX
pastas: O ícone do iniciador é diferente de outros recursos, pois é possível que um ícone de maior resolução seja exibido no iniciador de usuários. Se essa imagem de resolução mais alta tiver sido removida da pasta de desenhos, um ícone de densidade mais baixa será programaticamente ampliado. Isso pode causar um ícone embaçado e pouco atraente.Se você criar um APK para uma resolução de tela de destino, como o HDPI, a ferramenta de empacotamento de recursos do Android, AAPT, poderá remover os drawables de outras resoluções que você não precisa. APK, independentemente da resolução de destino.
fonte
O entendimento que tenho sobre o mipmap é mais ou menos assim:
Quando uma imagem precisa ser desenhada, uma vez que temos diferentes tamanhos de tela e resoluções, algumas reduções terão que participar.
Se você tem uma imagem aceitável para um telefone celular de ponta, quando a dimensiona para o tamanho de um tablet de 10 ", é necessário" inventar "pixels que realmente não existem. Isso é feito com algum algoritmo de interpolação. quanto mais pixels tiver que ser inventado, mais tempo o processo leva e a qualidade começa a falhar.A melhor qualidade é obtida com algoritmos mais complexos que demoram mais tempo (média de pixels adjacentes versus copiar o pixel mais próximo, por exemplo).
Para reduzir o número de pixels que precisam ser inventados, com o mipmap você fornece diferentes tamanhos / resoluções da mesma imagem, e o sistema escolherá a imagem mais próxima da resolução que deve ser renderizada e fará o dimensionamento a partir daí. Isso deve reduzir o número de pixels inventados, economizando recursos a serem usados no cálculo desses pixels para fornecer uma imagem de boa qualidade.
Eu li sobre isso em um artigo explicando um problema de desempenho no libgdx ao dimensionar imagens:
http://www.badlogicgames.com/wordpress/?p=1403
fonte