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?

<?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 …

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:

  1. En primer lugar y muy obvio: hacer imágenes de tamaño correcto y mantenerlos en diferentes carpetas dibujables .

  2. 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 .

  3. 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


  1. Coloque la vista dentro de un diseño relativo.
  2. Quite la imagen de fondo.
  3. Agregue un ImageView antes de la vista dentro del diseño relativo
  4. 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.

https://android.googlesource.com/platform/frameworks/support/+/1949ae9aeaadf52ad7bd7bb74ca5419c67ea7f65/v7/appcompat/src/android/support/v7/internal/widget/DrawableWrapper.java

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:

  1. Crear una propia clase y ampliar la View que desea utilizar, aquí por ejemplo voy a utilizar el Button .
  2. onMeasure() el método onMeasure() 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.

  • ¿Cómo utilizar mi SurfaceView con main.xml en Android?
  • El tamaño de texto de Android en la lona difiere del tamaño de texto en TextView
  • Getmeasuredheight () y getmeasuredwidth () devuelve 0 después de View.measure ()
  • Cómo utilizar RenderScript con SurfaceView / View
  • Cómo detectar cuándo un conmutador se desliza, no se hace clic
  • Cómo mostrar / ocultar submenús dentro de NavigationView android
  • addView no funciona
  • Android dibuja usando SurfaceView y el hilo
  • ¿Cómo puedo añadir contenido personalizado en una vista de navegación
  • Vincular la vista personalizada de Android a una xml de diseño específico (¿es posible?)
  • En qué condiciones se llama a getChildView () en ExpandableListAdapter
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.