drawables mipmap para ícones

? Richard Le Mesurier @ | Original: StackOverFlow
---

Desde Android 4.3 agora podemos fazer uso das pastas res/mipmap para armazenar imagens " mipmap " .

por exemplo Chrome para Android armazena seus ícones nestas pastas em vez de o mais normal res/drawable pastas .

Como essas imagens mipmap diferente das outras imagens drawable familiares ?

Eu vejo que no meu manifesto, usamos o @mipmap/ qualifier, em vez de @drawable/, o que faz sentido, dado o nome da pasta de recursos:

<activity
    android:name=".MipmapDemp"
    android:icon="@mipmap/ic_launcher" />
References:

O documento https://developer.android.com/about/versions/android-4.3.html tem o seguinte a dizer:

Usando um mipmap como fonte para o seu bitmap ou drawable é uma simples   maneira a proporcionar uma qualidade de imagem e várias escalas de imagem, que pode ser   particularmente útil se você espera que sua imagem para ser escalado durante uma   animação.

Android (nível API 17) 4.2 adicionou suporte para mipmaps na Bitmap   classe Android troca as imagens MIP em seu Bitmap quando tiver fornecido   uma fonte mipmap e permitiram setHasMipMap (). Agora em Android 4.3,   você pode habilitar mipmaps para um objeto BitmapDrawable, bem como, por   proporcionando um ativo mipmap e definindo o android: mipmap atributo em um   bitmap arquivo de recurso ou pelo telefone hasMipMap ().

Eu não vejo nada ali que me ajuda a entender ?

http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap ter um android:mipMap propriedade :

Booleana. Ativa ou desativa a dica mipmap . Veja setHasMipMap () para   obter mais informações. O valor padrão é falso .

Isto não se aplica ao lançador ícones, tanto quanto eu posso ver.

A questão foi levantada no Google Groups ( https://groups.google.com/forum/#!topic/android-developers/ZUyF0JEwibs ), à qual Romain Guy respondeu :

É útil para fornecer uma imagem com uma resolução maior do que   normalmente ser computada ( por exemplo, em um dispositivo MDPI, Lançador pode   deseja que o ícone HDPI maior para exibir grandes atalhos de aplicativos. )

Eu sinto que isso quase faz o sentido dele, mas não completamente.

Eu ainda estou inclinado a ir com Randy Sugianto follow up:

Quais são as vantagens deste ? Existe algum guia de como usar   mipmaps, provavelmente para obter melhores ícones lançador ?

Naturalmente, http://en.wikipedia.org/wiki/Mipmap, que refere-se a uma técnica mais antiga inventado em 1983, que eu não consigo relacionar com a implementação atual Android .

Devemos estar armazenando todos os nossos ícones de aplicativos em res/mipmap Pastas estes dias, e quais são as diretrizes para essas imagens mipmap ?

Update #1

Aqui está um post de blog que tenta explicá-lo um pouco .

http://programmium.wordpress.com/2014/03/20/mipmapping-for-drawables-in-android-4-3/

Mas a imagem usada nesse post mostra o que parece ser um arquivo com muitos logotipo da nela. Este não é o que eu vejo na pasta mipmap do Chrome.

Pasta mipmap-hdpi do Chrome contém 3 imagens. Um deles é o logotipo Chrome, por conta própria.

drawables mipmap para ícones

Estranhamente, é 72x72, 48x48 não que eu poderia esperar para ver .

Talvez isso é tudo o que há para isso - só precisamos manter ícones maiores nas pastas mipmap ?

Update #2

O Android Developers Blog post de 23/10/2014 confirma mais uma vez a idéia de usar os mipmap pastas de ícones de aplicativos :

http://android-developers.blogspot.com/2014/10/getting-your-apps-ready-for-nexus-6-and.html

Ao falar sobre a densidade da tela Nexus 6, o autor escreve :

É melhor prática para colocar seus ícones de aplicativos em pastas mipmap- (não o   pastas drawable- ), porque eles são usados ​​em diferentes resoluções de   densidade de corrente do dispositivo . Por exemplo, um ícone de aplicação xxxhdpi pode ser   utilizado no lançador para um dispositivo xxhdpi .

---

Top 5 Responder

1Kevin TeslaCoil @

Há dois usos distintos de mipmaps .

1) Para ícones de lançadores ao construir APKs específicas densidade. Alguns desenvolvedores construir APKs separadas para cada densidade, para manter o tamanho APK para baixo. No entanto, alguns lançadores (fornecido com alguns dispositivos, ou disponíveis na Play Store ) usar tamanhos de ícones maiores do que o padrão 48dp . Lançadores usar getDrawableForDensity e escala para baixo, se necessário, em vez de para cima, de modo que os ícones são de alta qualidade . Por exemplo, em um tablet HDPI o lançador pode carregar o ícone xhdpi . Ao colocar o ícone do lançador no diretório mipmap - xhdpi, não será retirado do caminho de um diretório drawable - xhdpi é quando a construção de um APK para dispositivos hdpi . Se você está construindo um único APK para todos os dispositivos, então isso realmente não importa como o lançador pode acessar os recursos drawable para a densidade desejada .

2) A API mipmap real de 4,3 . Eu nunca usei isso e não estou familiarizado com ele. Não é usado pelos lançadores Projeto Android Open Source e eu não estou ciente de qualquer outro lançador usando.

2Juan @

O entendimento que tenho sobre mipmap é mais ou menos assim:

Quando uma imagem precisa ser desenhado, uma vez que temos diferentes tamanhos de tela são resoluções, algumas dimensionamento terá que participar .

Se você tem uma imagem que é ok para um telefone celular de baixo final, quando você escalá-lo para o tamanho de um " tablet você tem que" 10 inventar " pixels que na verdade não existem. Isso é feito com algum algoritmo de interpolação . A mais quantidade de pixels que têm de ser inventadas, o processo demora mais tempo a qualidade e começa a falhar . Melhor qualidade é obtido com algoritmos mais complexos que levam mais tempo ( média de pixles circundantes vs copiar o pixel mais próximo, por exemplo) .

Para reduzir o número de pixels que têm de ser inventado, com mipmap você fornecer diferentes tamanhos / rsolutions da mesma imagem, e o sistema irá escolher a imagem mais próxima da resolução que deve ser prestado e fazer a escala de lá. Isso deve reduzir o número de pixels inventadas poupança de recursos a serem utilizados no cálculo dessas pixels para proporcionar uma boa qualidade de imagem .

Eu li sobre isso em um artigo explicando um problema de desempenho em libgdx quando dimensionar as imagens :

http://www.badlogicgames.com/wordpress/?p=1403

3matiash @

A implementação do Android mipmaps em 4.3 é exatamente a técnica de 1983 explicado no artigo Wikipedia :)

Cada imagem bitmap do conjunto mipmap é uma duplicata downsized do   textura principal, mas a uma certa redução do nível de detalhe . embora o   textura principal ainda seria usado quando a vista é suficiente para tornar   -lo com todos os detalhes, o processador irá mudar para uma imagem de mipmap adequado   ( ... ) Quando a textura é visto a partir de uma distância ou a um tamanho pequeno .

Embora este é descrito como uma técnica para gráficos 3D (como ele menciona " a visualização à distância " ), aplica-se tão bem a 2D ( traduzido como " desenhada é um espaço menor ", ou seja, " downscaled " ) .

Para um exemplo concreto Android, imagine que você tem uma vista com um certo fundo drawable (em particular, a BitmapDrawable ) . Agora você usar uma animação para escalá-lo a 0,15 do seu tamanho original . Normalmente, isso exigiria a redução de escala bitmap de fundo para cada quadro. Esta redução de escala "extremo", no entanto, pode produzir artefatos visuais .

Você pode, no entanto, fornecer um mipmap, o que significa que a imagem está já pré -renderizados por algumas escalas específicas ( digamos 1,0, 0,5 e 0,25) . Sempre que a animação " cruza " o limite de 0,5, em vez de continuar a downscale a imagem original, 1,0 porte, que vai exibir a imagem 0,5 e downscale -lo, o que deverá proporcionar um melhor resultado. E assim por diante, como a animação continua.

Isto é um pouco teórica, uma vez que é realmente feito pelo processador. De acordo com a fonte da classe Bitmap, é apenas uma sugestão, e o processador pode ou não honrá-lo .

/**
 * Set a hint for the renderer responsible for drawing this bitmap
 * indicating that it should attempt to use mipmaps when this bitmap
 * is drawn scaled down.
 *
 * If you know that you are going to draw this bitmap at less than
 * 50% of its original size, you may be able to obtain a higher
 * quality by turning this property on.
 * 
 * Note that if the renderer respects this hint it might have to
 * allocate extra memory to hold the mipmap levels for this bitmap.
 *
 * This property is only a suggestion that can be ignored by the
 * renderer. It is not guaranteed to have any effect.
 *
 * @param hasMipMap indicates whether the renderer should attempt
 *                  to use mipmaps
 *
 * @see #hasMipMap()
 */
public final void setHasMipMap(boolean hasMipMap) {
    nativeSetHasMipMap(mNativeBitmap, hasMipMap);
}

Eu não estou muito certo por que isso seria especialmente adequado para os ícones de aplicativos, no entanto. Embora o Android em tablets, bem como alguns lançadores ( eg gel), pedir um ícone " uma maior densidade " para mostrá-la maior, isto é suposto ser feito usando o mecanismo regular ( ou seja, drawable-xxxhdpi, & amp; c).

4kreker @

Uma coisa que eu mencionei em outro segmento que vale destacar - se você está construindo diferentes versões do seu aplicativo para diferentes densidades, você deve saber sobre o diretório de recursos " mipmap " . Este é exatamente como recursos " resgatáveis ​​", exceto que ele não participa de decapagem densidade ao criar diferentes alvos apk .

https://plus.google.com/105051985738280261832/posts/QTA9McYan1L