android xml drawable tiling

android - Tiled drawable a veces se estira



xml tiling (9)

Tengo un ListView cuyos elementos tienen un fondo de mosaico. Para lograr esto, uso el siguiente xml dibujable:

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

Por lo general, esto funciona. A veces, sin embargo, el src dibujable no está en mosaico, sino que se estira para llenar todo el elemento de la lista. (Tengo varios mosaicos diferentes como este, y los uso mezclados en un ListView. Si hay estiramiento en lugar de mosaico, nunca ha estado en todos a la vez, por lo que eso vale).

También traté de agregar android:dither="true" a ese xml, ya que leí en algún lado que sin él podría haber errores. Eso no cambió nada.

¿Alguien ha tenido el mismo problema? ¿Cómo lo arreglaste?


Acabo de tener exactamente el mismo problema, excepto con CLAMP TileMode. Tengo un mapa de bits que quiero luego estirar en la parte inferior y configurarlo como un mapa de bits definido XML y en la ventana de vista previa gráfica todo se ve bien, no importa qué tamaño haga que ViewImage dibuje mi mapa de bits en la parte superior y luego repite los últimos píxeles para completar hasta el final.

Al iniciar la aplicación en varias compilaciones de SDK en el emulador y en mi propio teléfono, todo produjo una distorsión tipo "relleno" que es completamente inútil.

La solución resultó simplemente volver a aplicar TileMode cada vez que cambié el tamaño de ImageView dentro de mi código:

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

Ahora todo está bien. Entonces sí, esto parece un error para mí.



Esto suena como un error, aunque nunca lo he visto. Si tienes una APK simple que reproduce el problema, envíanosla a mí (romainguy / at / android.com) o envíame un error aquí .


Hay mucho ruido sobre este tema en línea, con varias (y numerosas) soluciones sugeridas.

  • Si todavía está perdido, mi sugerencia es mantener todos los recursos de mapas de bits en mosaico en dimensiones cuadradas y base-2 .

es decir: 16px por 16px para un activo de mosaico xhdpi.

Esperé que la plataforma Android "sobresaliera" para llenar un espacio si el mapa de bits no se mosaico a la perfección, y luego recortar el desperdicio. Sin embargo, probar un mapa de bits en mosaico 10px * 10px en mdpi, hdpi y xhdpi (y v2.3 a v4.0) ''inconsistentemente'' mostró este estiramiento.

La dimensión base-2 permite la división completa e incluso a medida que avanzas en las distintas resoluciones y cada dispositivo intenta pintar las fichas cada vez que se crea la vista.

En el desarrollo de Android, competimos con el hardware de rango y los vendedores sumergiendo sus dedos en la plataforma, a veces este tipo de magia negra trivial simplemente funciona.

Esto parece haber resuelto el problema para mí al menos. Merece un intento.


También estaba teniendo el mismo problema. Lo que me faltaba era que necesitábamos agregar el tipo de escala para que se ajustara a XY en la vista de la imagen para que el mapa de bits xml funcione correctamente.

tile_bitmap.xml

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

layout.xml

<ImageView android:layout_width="match_parent" android:src="@drawable/tile_bitmap" android:layout_height="match_parent" android:scaleType="fitXY"/>


También me picaron por este problema. Muy difícil de diagnosticar, aún más difícil de encontrar informes similares y soluciones utilizables.

"Tapas" en el canal freenode # android-dev irc viene con el siguiente método de utilidad:

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); } } }

Aplíquelo a todas las Vistas que tengan un conjunto de fondo en mosaico (p. Ej. FindViewById them).

Además, tengo la impresión de que este error comenzó a actuar después de configurar "anyDensity = true" en AndroidManifest.xml


Todavía sufrió este problema en dispositivos más antiguos que ejecutan Lollipop, ocurre en cambios de orientación. Configurar el modo de mosaico programáticamente no funcionó, pero esta respuesta sí: https://.com/a/13480444/658727


Esta entrada de blog discute el problema

combinado con esta solución de Tapas listada por Ivo van der Wijk, funciona para mí.

La clave era eliminar la configuración de mosaico del XML, luego establecerlo en mosaico en tiempo de ejecución. No funciona para mí si ambos están configurados en mosaico.

Editar: en realidad, mentí. Incluso con esto, parece que a veces no se puede jugar.

Sería muy agradable tener una solución confiable.

Editar 2: configurarlo en otra cosa (por ejemplo, CLAMPED) y luego volver a establecerlo hasta ahora parece estar funcionando.


drawable-xhdpi mi imagen de drawable-xhdpi a la carpeta drawable-xhdpi y todo estaba bien.