ImageView está cubriendo el efecto de rizado del botón de superposición

Tengo un ImageView que actúa como un fondo a un Relativelayout con un botón de la restauración que se sienta encima de él. El efecto de rizado del botón está siendo cubierto por ImageView debajo. He intentado FrameLayouts etc, pero nada parece ayudar.

introduzca la descripción de la imagen aquí

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_drawer" android:layout_width="315dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/sidebar_bg_color" android:orientation="vertical"> <ImageView android:id="@+id/imageView4" android:layout_width="fill_parent" android:layout_height="165dp" android:layout_alignParentTop="true" android:src="@drawable/device_bg" /> <LinearLayout android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentEnd="true" android:layout_alignParentTop="true" android:background="?android:attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:gravity="center" android:orientation="vertical"> <ImageView android:id="@+id/imageView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/sidebar_refresh" /> </LinearLayout> </RelativeLayout> 

Con selectableItemBackgroundBorderless , puede hacer así:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_drawer" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" android:background="@android:color/holo_green_light" android:orientation="vertical"> <ImageView android:id="@+id/imageView4" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:scaleType="fitXY" android:src="@drawable/device_bg" /> <ImageView android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentEnd="true" android:layout_alignParentTop="true" android:src="@drawable/sidebar_refresh" /> <LinearLayout android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentEnd="true" android:layout_alignParentTop="true"> <FrameLayout android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:padding="7dp" android:background="@android:color/transparent"> <ImageView android:id="@+id/imageView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="true" android:src="@drawable/sidebar_refresh" android:alpha="0" android:background="?attr/selectableItemBackgroundBorderless"/> </FrameLayout> </LinearLayout> </RelativeLayout> 

La clave es que el efecto ripple debe tener sus propios diseños ( LinearLayout + FrameLayout ), luego use alpha="0" para establecer transparente a la imagen que tiene ondulación para superponer la imagen que es sólida.

El problema con este código es:

  1. Tienes que codificar el relleno. Si no hay acolchado o relleno demasiado pequeño, el efecto de ondulación se limitará a rectangular, no círculo. Utilice la fórmula 48 (altura / ancho) / 7 para calcular el relleno. Si la división por 7 no funciona, disminuya el divisor, por ejemplo 6.
  2. Debido a que tiene relleno, por lo que no puede tocar el relleno para activar el efecto de rizo. Es aceptable si se trata de un botón pequeño porque no es obvio, pero importa si es un gran botón.

La buena noticia es que hay una forma alternativa de simular selectableItemBackgroundBorderless con la etiqueta ripple en drawable/ripple.xml :

 <?xml version="1.0" encoding="utf-8"?> <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?android:colorPrimary"> <item android:id="@android:id/mask"> <shape android:shape="oval"> <solid android:color="?android:colorPrimary"/> </shape> </item> </ripple> 

De lo que observé, da el mismo efecto de la ondulación (excepto que no tiene la ondulación del desbordamiento) como selectableItemBackgroundBorderless hace, así que ninguna razón usted insiste para utilizar selectableItemBackgroundBorderless defecto

Con este ripple.xml , haz así:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_drawer" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" android:background="@android:color/holo_green_light" android:orientation="vertical"> <ImageView android:id="@+id/imageView4" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:scaleType="fitXY" android:src="@drawable/device_bg" /> <ImageView android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentEnd="true" android:layout_alignParentTop="true" android:src="@drawable/sidebar_refresh" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentTop="true"> <FrameLayout android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:background="@android:color/transparent"> <ImageView android:id="@+id/imageView3" android:layout_width="48dp" android:layout_height="48dp" android:clickable="true" android:src="@drawable/ripple" /> </FrameLayout> </LinearLayout> </RelativeLayout> 

El único cambio fue LinearLayout parte. No más hard-coded padding y ninguna imagen alfa. El único problema menor fue hacer clic en la esquina seguirá activando el efecto de rizo. Encontré este hilo pero no lo he intentado.

Las dos formas de trabajar incluso la imagen no es transparente.

  • Agregar botón como "Nuevo correo" de la aplicación de Gmail
  • FloatingActionButton con texto en lugar de imagen
  • ¿Cómo buscar el contenido del sitio web y ponerlo en la forma en que queremos en el diseño de la aplicación para Android?
  • Obtener AppCompat no admite la excepción de características del tema actual después de actualizar a la versión AppCompat v22.1.0 issue
  • Lollipop Barra de progreso Tinción
  • El color primario (a veces) se vuelve transparente
  • RippleDrawable creada programaticamente se ve diferente de su contraparte xml
  • cómo cambiar el color de texto del elemento de menú de la barra de acciones en el diseño del material
  • Multilínea Vista de texto en CollapsingToolbarLayout en lugar de Título
  • Fragmento de error: tipos incompatibles, requiere android.app.fragment pero encontró activity.messagefragment
  • Los elementos de pestaña inflados en Tab Layout no coinciden con parent en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.