Establecer una imagen de fondo en una vista extiende mi vista
He creado un mapa de bits de imagen de fondo para una vista y ahora la vista se está estirando al tamaño de la imagen de fondo ….
¿esto es normal?
- ¿Hay una manera de crear el stackoverfow "Etiquetas" EditText / Campo de entrada en Android?
- Cambiar vista en el flujo de portada - Android
- Cómo cambiar android SearchView text
- Android - SearchView en la barra de herramientas no se está expandiendo
- Menús dinámicos en NavigationView
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/green" android:tileMode="repeat"/>
Aquí es cómo lo aplico a mi opinión
v.setBackgroundResource(R.drawable.backgroundgreen);
por ejemplo…
Si la imagen es 500px en altura y la vista es 200px en altura (que se establece wrap_content como altura) después de establecer la imagen como fondo de mi vista se convierte en 500px en altura …
- La sugerencia de SearchView no funciona con un carácter
- ¿Cómo hacer una devolución de llamada después de que la vista esté completamente renderizada?
- El niño especificado ya tiene un padre
- Restaurar la jerarquía de vista desde el estado guardado no restaura las vistas agregadas programaticamente
- Cómo obtener la entrada de searchview a textview
- Obtener el ancho / altura de la vista o el ancho / altura / otros tamaños de la fuente antes de la primera visualización
- Problema: el niño especificado ya tiene un padre. Debe llamar a removeView () en el padre del niño primero
- ¿Cómo agrego un botón a una clase "extends View"?
Según mi opinión, el problema al que se enfrenta no es un problema, sino la forma en que se utiliza Android para diseñar los diseños.
Esto significa que puede establecer la altura y el ancho con 3 valores constantes predeterminados:
LLENAR LOS PADRES
Valor especial para la altura o anchura solicitada por una View
. FILL_PARENT
significa que la Vista quiere ser tan grande como su padre, menos el relleno del padre si lo hay. Este valor está obsoleto comenzando en el Nivel 8 de API y reemplazado por MATCH_PARENT
.
MATCH_PARENT
Valor especial para la altura o anchura solicitada por una View
. MATCH_PARENT
significa que la vista quiere ser tan grande como su padre, menos el relleno del padre si lo hay. Introducido en el nivel 8 de la API.
RESUMIR CONTENIDO
Valor especial para la altura o anchura solicitada por una View
. WRAP_CONTENT
significa que la View
quiere ser lo suficientemente grande para ajustar su propio contenido interno, teniendo en cuenta su propio relleno.
Ahora, cuando está configurando la altura / ancho de la WRAP_CONTENT
en WRAP_CONTENT
, está permitiendo que la vista tome ese tamaño que sea suficiente para mostrar el contenido de la vista. La imagen de fondo es también el contenido de la vista, por lo tanto la vista se mostrará con el mismo tamaño que la imagen. Eso no es un problema, así es como se muestra.
Bueno, pero en su situación que es un problema para usted, ya que tiene un fondo para mostrar y ver no debe ser estirado para eso. Puedo sugerir algunas maneras:
-
En primer lugar y muy obvio: hacer imágenes de tamaño correcto y mantenerlos en diferentes carpetas dibujables .
-
Especifique el tamaño de la vista que no utilice constantes , pero en DP . Si es necesario, haga diferentes archivos XML de diseño para diferentes tamaños y guárdelos en las carpetas de diseño .
-
Puede utilizar una cosa muy útil para el diseño de diseño es el peso de diseño .
He enfrentado el mismo problema.
Si la imagen de fondo tiene un tamaño mayor que el tamaño de la vista, el tamaño de la vista cambiará para que coincida con el tamaño de la imagen.
Solución
- Coloque la vista dentro de un diseño relativo.
- Quite la imagen de fondo.
- Agregue un ImageView antes de la vista dentro del diseño relativo
-
Establezca el
src
de ImageView en su imagen de fondo<RelativeLayout . . . > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/yourViewId" android:layout_alignRight="@+id/yourViewId" android:layout_alignTop="@+id/yourViewId" android:layout_alignBottom="@+id/yourViewId" android:adjustViewBounds="true" //this will allow the image to resize with same proportions android:src="@drawable/yourDrawable" /> <YourView android:id="@+id/yourViewId" . .. ... /> </RelativeLayout>
Todo esto se puede hacer en código, por supuesto.
Sugiero crear una disposición del envoltorio y poner la imagen de fondo allí. Lo estoy usando de esa manera y encaja muy bien. Ver ejemplo abajo
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/settingstab_scroll" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scrollbars="vertical" android:background="@drawable/wareninja_wallpaper_img" > <!-- your layouts and components goes here --> </ScrollView>
…
Codificación social @ AspiroTV
Está funcionando para mí.
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/LinearLayoutTest">
@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.prueba); ((LinearLayout)findViewById(R.id.LinearLayoutTest)).setBackgroundResource(R.drawable.greenrepeat); }
En su código, ¿qué es v? ¿Tiene params a fill_parent?
La razón es bastante simple. Tienes que ver el método View :: getSuggestedMinimumWidth / Height.
protected int getSuggestedMinimumWidth() { return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimumWidth()); } protected int getSuggestedMinimumHeight() { return (mBackground == null) ? mMinHeight : max(mMinHeight, mBackground.getMinimumHeight()); }
Al ver que, usted puede saber por qué el fondo hace una vista más grande, especialmente por qué asignar un BitmapDrawable a la misma.
Y la solución simple es envolver ese Drawable (por ejemplo, BitmapDrawable), luego devuelve 0 para getMinimumHeight () y getMinimumWidth (), y mejor reemplazar getIntrinsicHeight () y getIntrinsicWidth () devuelve -1.
Support-v7 tiene un DrawableWrapper que delega las llamadas a otro drawable cuando es necesario. Usted puede extender que uno y los métodos del override hablaron arriba.
Y si no usas soporte-v7 (WoW, eres impresionante), copia esa clase a tu proyecto también está bien.
No utilice android:tileMode="repeat"
. ¿Es su green drawable más grande o más pequeño que su vista? ¿Podría agregar más detalles?
Una buena solución que está funcionando perfectamente en mi caso es ampliar la View
y sobreescribir onMeasure()
.
Estos son los pasos a seguir:
- Crear una propia clase y ampliar la
View
que desea utilizar, aquí por ejemplo voy a utilizar elButton
. -
onMeasure()
el métodoonMeasure()
e inserte el código en la parte inferior. Esto establecerá el recurso de fondo después de que se haya realizado la primera medida. Para el segundo evento de medida, utilizará los parámetros ya medidos.
Código de ejemplo para una vista personalizada que se extiende Button
(cambie el botón a la vista que desea extender)
public class MyButton extends Button { boolean backGroundSet = false; public MyButton(Context context) { super(context); } public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } public MyButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if(backGroundSet) { setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight()); return; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); backGroundSet = true; setBackgroundResource(R.drawable.button_back_selector); } }
Lo único que hay que cambiar aquí es el tipo de vista que desea ampliar y en el método onMeasure()
el recurso de fondo que desea utilizar para la vista.
Después de eso, basta con usar esta vista en su xml de diseño o agregarlo programatically.