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.
- CollapsingToolbarLayout | Problemas de desplazamiento y diseño 2
- Android nivel 21 compatibilidad hacia atrás? (Desde que salió la nueva actualización del SDK)
- La elevación no funciona en un LinearLayout
- Barra de herramientas de AppCompat: establece el tema de la barra de herramientas desde el tema superior
- ¿Cuál es el tamaño de icono de ActionBar recomendado en Diseño de material (Android API 21+)?
<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>
- Tablas de material de Android 5.0 con barra de herramientas
- ¿Cómo implementar el diseño del material con la disposición de restricciones?
- ¿Cómo habilitar o falsificar la mini variante de la guía de diseño de materiales para android.support.v4.widget.DrawerLayout?
- Alertdialog en el diseño del material
- Fragmento de diálogo de pantalla completa de Android como aplicación de calendario
- ¿Botón circular material en Android?
- Diseño de materiales paleta de colores
- Inbox de Google como elemento de RecyclerView abrir animación
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:
- 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.
- 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.
- Fiabilidad del método postDelay de Android
- Zxing Android – ¿Cómo obtener escáner / cámara no en pantalla completa?