studio libreria gone color clase android view background

android - libreria - Establecer una imagen de fondo para una vista extiende mi vista



view android studio (7)

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 tu código, ¿qué es v? Tiene params para fill_parent?

Creé un mapa de bits de la imagen de fondo para una vista y ahora la vista se estira 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"/>

así es como lo aplico a mi vista

v.setBackgroundResource(R.drawable.backgroundgreen);

por ejemplo...

si la imagen es de 500px de alto y la vista es de 200px de alto (se establece wrap_content como height) después de configurar la imagen como fondo, mi vista se convierte en 500px de alto ...


He enfrentado este mismo problema.

Si la imagen de fondo tiene un tamaño que es más grande que el tamaño de la vista, el tamaño de la vista cambiará para coincidir con el tamaño de la imagen.

Solución

  1. Coloque la vista dentro de un Diseño relativo.
  2. Eliminar 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.


La razón es bastante simple. Debes 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 eso, puede saber por qué el fondo hace que una vista sea más grande, especialmente por qué asignarle un mapa de bits.

y la solución simple es envolver ese Drawable (por ejemplo, BitmapDrawable), luego devuelve 0 para getMinimumHeight () y getMinimumWidth (), y mejor para anular getIntrinsicHeight () y getIntrinsicWidth () en returns -1.

support-v7 tiene un DrawableWrapper que delega las llamadas a otro dibujable cuando sea necesario. puede extender eso y anular los métodos mencionados anteriormente.

y si no usas support-v7 (¡WoW! eres increíble), copiar 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 use android:tileMode="repeat" . ¿Su dibujo verde es más grande o más pequeño que su vista? Podría agregar más detalles?


Según yo, el problema al que se enfrenta no es un problema, es la forma en que se usa Android para diseñar los diseños.

Esto significa que puede establecer el alto y el ancho con 3 valores constantes predeterminados:

LLENAR LOS PADRES
Valor especial para la altura o el ancho solicitado por una View . FILL_PARENT significa que la Vista quiere ser tan grande como su elemento primario, menos el relleno de los padres, si corresponde. Este valor está en desuso, comenzando en API Nivel 8 y reemplazado por MATCH_PARENT .

MATCH_PARENT
Valor especial para la altura o el ancho solicitado por una View . MATCH_PARENT significa que la vista quiere ser tan grande como su padre, menos el relleno de los padres, en su caso. Introducido en API Nivel 8.

RESUMIR CONTENIDO
Valor especial para la altura o el ancho solicitado por una View . WRAP_CONTENT significa que la View quiere ser lo suficientemente grande como para ajustarse a su propio contenido interno, teniendo en cuenta su propio relleno.

Ahora, cuando configura el alto / ancho de la WRAP_CONTENT en WRAP_CONTENT , está permitiendo que la vista tome ese tamaño suficiente para mostrar el contenido de la vista. La imagen de fondo también es el contenido de la View , por lo tanto, su vista se mostrará con el mismo tamaño que la imagen. Eso no es un problema, así es como se muestra.

De acuerdo, pero en tu situación, eso es un problema para ti porque tienes un fondo para mostrar y ver que no se debe estirar para eso. Puedo sugerir algunas maneras:

  1. Primero y muy obvio: haga imágenes de tamaño correcto y guárdelas en diferentes carpetas dibujables .

  2. Especifique el tamaño de vista que no usa constants , pero en DP . Si es necesario, cree diferentes archivos XML de diseño para diferentes tamaños y guárdelos en carpetas de diseño .

  3. Puede usar una cosa muy útil para el diseño de diseño es el peso de diseño .


Sugiero crear un diseño de envoltura y poner la imagen de fondo allí. Lo estoy usando de esa manera y me queda muy bien. ver el ejemplo a continuación

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


...
Social Coding @ AspiroTV


Una buena solución que está funcionando perfectamente en mi caso es ampliar la View y anular onMeasure() .

Aquí están los pasos a seguir:

  1. Cree una clase propia y extienda la View que desea usar, aquí, por ejemplo, usaré el Button .
  2. Reemplace 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, usará los parámetros ya medidos.

Código de ejemplo para una vista personalizada que amplía el Button (cambie el Botón a la Vista que le gustaría 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 debe cambiar aquí es el tipo de vista que desea extender y en el método onMeasure() el recurso de fondo que desea usar para la vista.

Después de eso, simplemente use esta vista en su diseño xml o agréguela programáticamente.