layout_width layout_weight examples ejemplo dinamico constraint android android-layout

layout_weight - table layout android



Coloque ImageView sobre el botón de Android (9)

Estoy tratando de colocar un ImageView sobre un botón usando RelativeLayout. Aquí está mi xml:

<RelativeLayout android:layout_width="0dip" android:layout_height="match_parent" android:layout_margin="10dp" android:layout_weight="0.50" > <Button android:id="@+id/btnFindDaysInBetween" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/blue_500" android:text="@string/dt_text_days" /> <ImageView android:id="@+id/imageview_find_days_in_between" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:contentDescription="@string/empty" android:src="@drawable/ic_check_circle_white" /> </RelativeLayout>

Aquí está la captura de pantalla de la imagen:

Como puede ver, la imagen src de ImageView no es visible. Sin embargo, si cambio el botón en la parte posterior a un ImageView, la imagen del ImageView superior es visible. Consulte más adelante..

Xml cambiado:

<RelativeLayout android:layout_width="0dip" android:layout_height="match_parent" android:layout_margin="10dp" android:layout_weight="0.50" > <!-- <Button android:id="@+id/btnFindDaysInBetween" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/blue_500" android:text="@string/dt_text_days" /> --> <ImageView android:id="@+id/imageview_find_days" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:contentDescription="@string/empty" android:src="@drawable/ic_send_black" /> <ImageView android:id="@+id/imageview_find_days_in_between" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:contentDescription="@string/empty" android:src="@drawable/ic_check_circle_white" /> </RelativeLayout>

Captura de pantalla del XML cambiado:

¿Qué es lo que estoy haciendo mal en el primer diseño?


@Vamsi Probé ambas combinaciones y la primera no funciona con Button . Tienes que pasar por ImageView. Esto es lo que intenté con ImageView :

Mientras intentaba hacerlo con Button y ver cuál era el resultado:

Intenté cambiar el orden pero todo fue en vano! Parece que tienes que ir con ImageView o ImageButton .

¡Al final! Puedes ver lo que había intentado:

<RelativeLayout android:layout_height="match_parent" android:layout_width="match_parent"> <!-- <ImageView android:id="@+id/btnTest" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/ic_launcher_web" android:contentDescription="@string/app_name" android:text="@string/app_name" /> --> <ImageView android:layout_width="wrap_content" android:id="@+id/imgView" android:layout_height="wrap_content" android:layout_centerInParent="true" android:contentDescription="@string/app_name" android:src="@drawable/ic_launcher" /> <Button android:id="@+id/btnTest" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/imgView" android:layout_alignTop="@+id/imgView" android:text="@string/app_name" /> </RelativeLayout>

Hice el mismo tipo de trabajo con ImageView o ImageButton (probablemente con ImageView ) y probé el mismo enfoque que intentabas con Button .

Gracias


Button es solo un TextView con un cierto estilo aplicado, así que si reemplaza Button con TextView puede mostrar un ImageView encima de él. Esto también funciona en la API <21.


Coloqué ImageView en un botón con un desvío de RelativeLayout, espero que esto ayude.

<RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <View android:id="@+id/tempview" android:layout_width="0dp" android:layout_height="0dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tempview" android:background="@drawable/ic_launcher" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tempview" android:src="@drawable/img_cancel" /> </RelativeLayout>



Encontré una solución: simplemente android: elevation = "2dp"

<Button android:id="@+id/btnAccess" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_alignParentBottom="true" android:layout_gravity="right|center" android:layout_marginBottom="10dp" android:layout_marginTop="10dp"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView4" android:background="@drawable/or" android:layout_alignBottom="@+id/btnRegister" android:layout_centerHorizontal="true" android:layout_margin="5dp" android:elevation="2dp" />


La razón es en realidad muy simple. :) Estamos tan atrapados pensando en 2D que pasamos por alto la elevation , en Z.

No hay nada malo con tu primer diseño. El Button simplemente tiene una elevation más elevation que ImageView : exactamente 1dp más alto. Por lo tanto, no importa cómo organice las dos vistas, el Button eleva arriba.

Un poco de prueba :

Un botón, por defecto obtiene el estilo Widget.Material.Button :

<!-- Bordered ink button --> <style name="Widget.Material.Button"> <item name="background">@drawable/btn_default_material</item> <item name="textAppearance">?attr/textAppearanceButton</item> <item name="minHeight">48dip</item> <item name="minWidth">88dip</item> <item name="stateListAnimator">@anim/button_state_list_anim_material</item> <item name="focusable">true</item> <item name="clickable">true</item> <item name="gravity">center_vertical|center_horizontal</item> </style>

El atributo que introduce esta elevación es android:stateListAnimator . StateListAnimator es similar a StateListDrawable y proporciona animaciones de cambio de estado. El xml completo está aquí: Link . Pero aquí está el estado base del botón:

<!-- base state --> <item android:state_enabled="true"> <set> <objectAnimator android:propertyName="translationZ" android:duration="@integer/button_pressed_animation_duration" android:valueTo="0" android:startDelay="@integer/button_pressed_animation_delay" android:valueType="floatType"/> <objectAnimator android:propertyName="elevation" android:duration="0" android:valueTo="@dimen/button_elevation_material" android:valueType="floatType" /> </set> </item>

Como puede ver, el valor de elevación para el botón se establece en @dimen/button_elevation_material :

<dimen name="button_elevation_material">1dp</dimen>

Y así es como el ImageView termina estando detrás / debajo del Button .

¿Entonces, qué podemos hacer?

Una solución directa sería establecer la elevación ImageView''s en la misma cantidad: 1dp .

Otra solución, que requerirá un poco de trabajo, es eliminar la elevación Button''s lugar de cambiar la de ImageView''s . Basándonos en el StateListAnimator predeterminado, podemos crear el nuestro y eliminar la elevación. Luego, en su res/values-v21/styles.xml , defina un estilo que herede de Widget.Material.Button :

<style name="MyDepressedButtonStyle" parent="android:Widget.Material.Button"> <item name="android:stateListAnimator">@anim/customized_state_animator</item> </style>

Ahora, establece este estilo en tu Button :

<Button style="@style/MyDepressedButtonStyle" .... .... />

Editar :

En realidad, podemos aplicar el StateListAnimator personalizado directamente:

<Button android:stateListAnimator="@anim/customized_state_animator" .... .... />

No es necesario tomar la ruta scenic !


Si desea obtener un ImageView encima de un botón, y está desarrollando para la API de Android <21 (por ejemplo, KitKat = 19), la forma más sencilla es no usar un botón y usar 2 ImageView. ¿Por qué querrías hacer eso? Puede deberse a que definió una forma dibujable para que el botón se vea "más fresco", por lo que ya está usando android: background con esa forma.

Ex:

<Button android:id="@+id/button01" android:layout_width="100dp" android:layout_height="100dp" android:background="@drawable/buttonshape" /> <ImageView android:id="@+id/image01" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginTop="10dp" android:layout_marginStart="10dp" android:src="@drawable/desiredImageOnTop" />

Donde @ drawable / buttonshape.xml es:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="30dp" /> <gradient android:angle="45" android:centerColor="#47A891" android:centerX="35%" android:endColor="#000000" android:startColor="#E8E8E8" android:type="linear" /> <padding android:bottom="0dp" android:left="0dp" android:right="0dp" android:top="0dp" /> <size android:width="100dp" android:height="100dp" /> <stroke android:width="3dp" android:color="#878787" /> </shape>

En ese caso, debe reemplazar el botón con un ImageView, cambiar android: background a android: src, y luego, en el código java, simplemente agrega un OnClickListener como si fuera un botón (ambos controles derivan de View y OnClickListener es un evento Ver). ¡Funciona de maravilla!


Use el ImageButton reemplazo de ImageButton y establezca el fondo de ImageButton como transparente

<ImageButton android:id="@+id/btnFindDaysInBetween" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/blue_500_text" android:background="@android:color/transparent" /> <ImageView android:id="@+id/imageview_find_days_in_between" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:contentDescription="@string/empty" android:src="@drawable/ic_check_circle_white" />

Puede crear una imagen que tenga su color y texto blue_500 (que es fácil de crear), luego configure esta imagen en su ImageButton . Después de eso, su ImageView verá en la parte superior de ImageButton .

¡Espero que esto ayude!


android:background existe para toda la vista. Como su nombre indica, esto es lo que habrá en el fondo.

android:src existe para ImageViews y sus subclases. Puedes pensar en esto como el primer plano. Debido a que ImageView es una subclase de View, incluso tiene android:background para eso.

Si el primer plano es más pequeño que el fondo, la parte del fondo que no está cubierta por el primer plano sería visible. Además, puede utilizar la transparencia en el primer plano, en cuyo caso el fondo sería visible (de forma transparente). Puedes usar ANTECEDENTES PARA TODAS LAS VISTAS ... Pero puedes usar SRC solo para ImageView y ImageButton ...