android - vista - vision 20/200 que significa
Los dibujables de fondo definen el tamaño de la vista (4)
En aras de la claridad, esta pregunta ha sido editada significativamente .
Digamos que tengo un recurso .png de 100x100px:
Quiero usar esa imagen como fondo para mis TextView
s, cuyo tamaño está determinado por su contenido, que es variable en tiempo de ejecución. Especialmente, quiero que la imagen se muestre en mosaico cuando el tamaño de TextView
sea mayor que 100x100px, y quiero que se recorte cuando TextView
sea menor que 100x100px.
Este último parece ser difícil.
Código de ejemplo
Tengo un recurso bg_tile.xml
:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/bg"
android:tileMode="repeat" />
Mi archivo de diseño:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="@drawable/bg_tile"
android:text="Short text"
android:textSize="20sp" />
<TextView android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_tile"
android:text="Long text long text long text long text long text long text long text long text long textlong text long text long text long text long text long text long text long text long textlong text long text long text long text long text long text long text long text long text "
android:textSize="20sp" />
</LinearLayout>
Qué esta pasando
Aquí hay una captura de pantalla del resultado de este código, y uno de lo que esperaría / lo que quiero:
Como puede ver, la parte de mosaico funciona y el azulejo inferior se está cortando. Sin embargo, cuando TextView
es más pequeño que el fondo, TextView
toma el tamaño del fondo.
Las soluciones sugeridas
-
android:gravity="clip_vertical|clip_horizontal"
- Esto no funciona, incluso sin tilemode. - Utilice
match_parent
comomatch_parent
diseño, no es una opción. - Configuración de una altura fija: no hay forma de saber cuánto
TextView
el contenido deTextView
, y con eso su tamaño.
¿Cómo puedo lograr mi objetivo?
No lo he intentado yo mismo, pero puedes probar esta idea / hackear / solución alternativa:
La altura / anchura mínima de una vista (TextView) está determinada por su fondo dibujable (entre otras cosas). Utiliza el getMinimumHeight () y getMinimumWidth () de Drawable de fondo para determinar la altura y el ancho mínimos de la vista.
Parece que desea que la altura y el ancho mínimos de la Vista sean 0 (excluyendo el relleno) y que la anchura / altura de la Vista solo se base en el contenido de la Vista (en su caso, el texto de TextView).
Intente esto en el onCreate de su Actividad o en el onCreateView de su Fragmento, donde obtiene una retención del TextView que está tratando de "arreglar". Llamemos a esto TextView ''tv'':
TextView tv;
...
...
tv = (TextView)...findViewById(...);
....
// Swap the ''standard'' bitmap background with one that has no minimum width/height.
BitmapDrawable background = (BitmapDrawable)tv.getBackground(); // assuming you have bg_tile as background.
BitmapDrawable newBackground = new BitmapDrawable(background.getBitmap) {
@Override
public int getMinimumWidth() {
return 0;
}
@Override
public int getMinimumHeight() {
return 0;
}
};
newBackground.setTileModeXY(background.getTileModeX(), background.getTileModeY());
tv.setBackgroundDrawable(newBackground);
...
...
Prueba esto:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/bg_light"
android:tileMode="repeat"
android:gravity="clip_vertical|clip_horizontal" />
Opciones adicionales: http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap
Edición: leí la documentación, esto no funcionará con el conjunto tileMode:
android:tileMode
Keyword. Defines the tile mode. When the tile mode is enabled, the bitmap is repeated. Gravity is ignored when the tile mode is enabled.
Si conoce el tamaño de las Vistas antes de tiempo y sabe que se recortaría, podría tener un Bitmap-XML para tileMode y otro para la gravedad, luego use el apropiado. No ideal, por desgracia.
Siempre puedes usar:
android:layout_width="match_parent"
android:layout_height="match_parent"
Supongo que tu problema está aquí:
android: layout_width = "wrap_content" android: layout_height = "wrap_content"
Establece el ancho para envolver el contenido, y el contenido incluye la imagen de fondo. No estoy seguro de cuál es el contexto de su vista, pero si puede establecer la altura desde el código o desde el archivo xml, su problema debería desaparecer. Es posible que también desee agregar android: scaleType = "centerCrop" o centerInside como Houcine mencionó si el fondo todavía no se muestra a su gusto.
Si nos dice el contexto de estas opiniones vagas, es probable que podamos darle más información.