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
- Coloque la vista dentro de un Diseño relativo.
- Eliminar 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.
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.
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:
Primero y muy obvio: haga imágenes de tamaño correcto y guárdelas en diferentes carpetas dibujables .
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 .
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>
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:
- Cree una clase propia y extienda la
View
que desea usar, aquí, por ejemplo, usaré elButton
. - 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.