Tuile dessinable parfois s’étire

J’ai un ListView dont les éléments ont un arrière-plan en mosaïque. Pour ce faire, j’utilise le fichier XML dessinable suivant:

 

Habituellement, cela fonctionne. Parfois, toutefois, le dessin src n’est pas en mosaïque, mais étiré pour remplir la totalité de l’élément de liste. (J’ai plusieurs tuiles différentes comme celle-ci, et je les utilise mélangées dans un ListView. S’il y a des étirements au lieu de mosaïques, cela n’a jamais été dans toutes les parties, pour ce que ça vaut.)

J’ai également essayé d’append android:dither="true" à ce XML, car j’ai lu quelque part que sans lui, il pourrait y avoir des bogues. Cela n’a rien changé.

Quelqu’un at-il eu le même problème? Comment l’avez-vous réparé?

J’ai aussi été mordu par ce problème. Très difficile à diagnostiquer, encore plus difficile de trouver des rapports et des solutions utilisables similaires.

“Tapas” sur le canal irc de freenode # android-dev est venu avec la méthode suivante:

 public static void fixBackgroundRepeat(View view) { Drawable bg = view.getBackground(); if (bg != null) { if (bg instanceof BitmapDrawable) { BitmapDrawable bmp = (BitmapDrawable) bg; bmp.mutate(); // make sure that we aren't sharing state anymore bmp.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT); } } } 

Appliquez-le à toutes les vues qui ont un ensemble d’arrière-plan en mosaïque (par exemple, findViewById).

J’ai aussi l’impression que ce bogue a commencé à agir après avoir défini “anyDensity = true” dans AndroidManifest.xml

Je viens juste d’avoir le même problème, sauf avec CLILE TileMode. J’ai un bitmap que je veux ensuite étirer en bas et le configurer en tant que BitmapDrawable XML défini et dans la fenêtre de prévisualisation graphique tout semble bien, quelle que soit la taille de ViewImage, il dessine mon bitmap en haut puis répète les derniers pixels à remplir jusqu’à la fin.

Le lancement de l’application sur différents modèles de SDK sur l’émulateur et sur mon propre téléphone a ensuite produit une distorsion de type «remplissage» qui est complètement inutile.

La solution s’est avérée être simplement de réappliquer le TileMode chaque fois que je changeais la taille d’ImageView dans mon code:

 ((BitmapDrawable)ascender.getDrawable()).setTileModeY(TileMode.CLAMP); 

Maintenant, tout va bien. Alors oui, cela ressemble à un bug pour moi.

Comme je n’ai pas vu le lien ici, cela a été confirmé comme étant un bogue dans Android. Il a été corrigé dans ICS. Voir le bogue XML bitmap pouvant être dessiné? pour plus de détails.

Il y a beaucoup de bruit sur ce sujet en ligne, avec diverses (et nombreuses) solutions suggérées.

  • Si vous êtes toujours en perte, ma suggestion est de garder toutes les ressources bitmap en mosaïque en carré, les dimensions de base-2 .

c’est-à-dire: 16px par 16px pour un actif de tuile xhdpi.

J’espérais que la plate-forme Android «saturerait» un espace si le bitmap ne marchait pas parfaitement, puis rogner le gaspillage. Cependant, tester un bitmap 10px * 10px en mosaïque entre mdpi, hdpi et xhdpi (et v2.3 à v4.0) montrait «de manière incohérente» cette extension.

La dimension base-2 permet une division complète et uniforme au fur et à mesure que vous progressez dans les différentes résolutions et que chaque périphérique essaie de peindre les tuiles à chaque création de la vue.

Dans le développement Android, nous contestons le matériel de télémésortinge et les vendeurs plongeant leurs doigts dans la plate-forme – parfois, cette sorte de magie noire sortingviale fonctionne.

Cela semble avoir résolu le problème pour moi au moins. Vaut le coup.

Cela ressemble à un bug, même si je ne l’ai jamais vu moi-même. Si vous avez un simple APK qui reproduit le problème, envoyez-le-moi (romainguy / at / android.com) ou déposez un bug ici .

Cet article traite du problème

combiné avec cette solution de Tapas répertoriée par Ivo van der Wijk, cela fonctionne pour moi.

La clé était de supprimer le paramètre en mosaïque du fichier XML, puis de le définir en mosaïque à l’exécution. Cela ne fonctionne pas pour moi si elles sont toutes deux définies en mosaïque.

Edit: en fait, j’ai menti. Même avec cela, il semble parfois ne pas être efficace.

Serait très bien d’avoir un travail fiable.

Edit 2: le paramétrer sur autre chose (par exemple, CLAMPED), puis le remettre en place semble fonctionner.

Encore souffert de ce problème sur les appareils plus anciens exécutant Lollipop, se produit sur les changements d’orientation. Définir le mode de mosaïque par programmation ne fonctionnait pas, mais cette réponse était la suivante: https://stackoverflow.com/a/13480444/658727

J’ai déplacé mon image de drawable-xhdpi vers drawable dossier drawable-xhdpi être drawable et tout allait bien.

J’avais aussi le même problème. Ce qui me manquait, c’est que nous devions append scaletype à fitXY dans l’imageview pour que le bitmap xml fonctionne correctement.

tile_bitmap.xml

  

layout.xml