54 votes

Le carrelage peut être étiré et s'étire parfois

J'ai une liste dont les éléments ont un arrière-plan en mosaïque. Pour ce faire, j'utilise la suite drawable xml:

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/tile"
    android:tileMode="repeat" />

Habituellement, cela fonctionne. Parfois, cependant, la src drawable n'est pas en faïence, mais étirée pour remplir l'ensemble de l'élément de la liste. (J'ai plusieurs pièces de ce genre, et je les utilise mélangé dans une ListView. Si il y a des étirements de carrelage, il n'a jamais été dans toutes à la fois, pour ce que ça vaut la peine.)

J'ai aussi essayé d'ajouter android:dither="true" pour que xml, depuis que j'ai lu quelque part que, sans elle, il pourrait y avoir des bugs. Qui n'a pas changé quoi que ce soit.

Quelqu'un a eu le même problème? Comment avez-vous résolu ce problème?

39voto

Ivo van der Wijk Points 7239

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

"Tapas" sur le canal freenode # android-dev irc est venu avec la méthode d’utilité 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 ayant un arrière-plan en mosaïque (par exemple, findViewById eux).

De plus, j'ai l'impression que ce bogue a commencé à s'aggraver après la définition de "anyDensity = true" dans AndroidManifest.xml.

9voto

Zulaxia Points 1572

J'ai juste eu exactement le même problème, sauf avec la PINCE TileMode. J'ai une image bitmap que je veux, puis il suffit de les étirer à l'écart au fond et avez mis en place comme un XML défini BitmapDrawable et dans le Graphique de la fenêtre d'Aperçu de tous a l'air bien, n'importe quelle taille je fais le ViewImage il attire mon bitmap en haut, puis répète la dernière pixels pour remplir à la fin.

Le lancement de l'app sur les différents SDK s'appuie sur l'émulateur et sur mon téléphone, tout produit alors une droite de "remplissage" de type distorsion, qui est complètement inutile.

La solution est avéré être tout simplement l'appliquer à nouveau le TileMode chaque fois que j'ai changé la taille de l'ImageView dans mon code:

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

Maintenant, c'est tout le schéma de l'amende. Donc oui, cela ressemble à un bug pour moi.

6voto

Steve Pomeroy Points 3968

Comme je n'ai pas vu le lien ici, il a été confirmé qu'il s'agissait d'un bogue dans Android. Il a été corrigé dans ICS. Voir le bogue bitmap tileMode dessinable en XML? pour plus de détails.

6voto

mjw Points 352

Il y a beaucoup de bruit sur ce sujet en ligne, avec les différents (et nombreux) des solutions proposées.

  • Si vous êtes toujours à une perte, ma suggestion est de garder tous les carrelé bitmap ressources à carré, base 2 dimensions.

c'est à dire: 16px par 16px pour un xhdpi tuile de l'actif.

J'espère que la plate-forme Android serait "tuile" pour remplir un espace si l'image n'a pas de maillage par approximation de la perfection, et puis tailler les déchets. Cependant le contre la montre d'un 10px*10px sol carrelé bitmap dans les mdpi, hdpi et xhdpi (et v2.3 v4.0)'de façon incohérente" a montré cet étirement.

La base-2 dimension permet, pour l'ensemble et de la même division que vous progressez à travers les différentes résolutions et que chaque appareil essaie de peindre les tuiles à chaque fois que la vue est créée.

Dans le développement Android, nous concours avec le allant le matériel et les fournisseurs de tremper leurs doigts dans la plate - forme parfois ce genre de trivial magie noire fonctionne, tout simplement.

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

2voto

Romain Guy Points 57114

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X