studio recyclerview ejemplo android android-animation android-recyclerview

android - ejemplo - Agregar efecto dominĂ³ al elemento RecyclerView



recyclerview android studio ejemplo (3)

Estoy tratando de agregar Ripple Effect al elemento de RecyclerView. Eché un vistazo en línea, pero no pude encontrar lo que necesitaba. Supongo que tiene que ser un efecto personalizado. He intentado el atributo android: background para el RecyclerView y lo configuré como "? Android: selectableItemBackground" pero no funcionó .:

<android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="true" android:clickable="true" android:background="?android:selectableItemBackground" android:id="@+id/recyclerView" android:layout_below="@+id/tool_bar"/>

Este es el RecyclerView al que estoy tratando de agregar el efecto:


Como ya se respondió, la solución más simple es agregar uno de los siguientes como fondo de la fila RecyclerView :

  • android:background="?android:attr/selectableItemBackground"
  • android:background="?attr/selectableItemBackground"

Sin embargo, si tiene problems con este método o si desea un control más fino sobre los colores, puede hacer lo siguiente.

Efecto ondulado personalizado

Esta respuesta comienza con este sencillo ejemplo de Android RecyclerView . Se verá como la siguiente imagen.

Agregar selector para dispositivos pre API 21

Antes de API 21 (Android 5.0 Lollipop), al hacer clic en un elemento RecyclerView solo se cambiaba el color de fondo (sin efecto dominó). Eso es lo que vamos a hacer también. Si todavía tiene usuarios con esos dispositivos, están acostumbrados a ese comportamiento, por lo que no nos preocuparemos demasiado por ellos. (Por supuesto, si realmente quieres el efecto dominó para ellos, también puedes usar una biblioteca personalizada ).

Haga clic con el botón derecho en su carpeta res/drawable y elija New> Drawable resource file . Llámalo custom_ripple . Haga clic en Aceptar y pegue el siguiente código.

custom_ripple.xml

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="@color/colorAccent" /> </shape> </item> <item> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent" /> </shape> </item> </selector>

Utilicé colorAccent como el color de resaltado para el estado presionado porque ya estaba disponible, pero puede definir el color que desee.

Agregue Ripple Effect para dispositivos API 21+

Haga clic con el botón derecho en su carpeta res/drawable y elija New> Drawable resource file . Llámalo custom_ripple nuevamente. Sin embargo, no hagas clic en Aceptar, pero esta vez. En la lista de calificadores disponibles, elija Versión , luego haga clic en el botón >> y escriba 21 para el nivel de API de plataforma . Ahora haga clic en Aceptar y pegue el siguiente código.

v21 / custom_ripple.xml

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

Nuevamente, usé colorAccent para el color colorAccent porque estaba disponible, pero puede usar el color que desee. La máscara limita el efecto dominó solo al diseño de la fila. El color de la máscara aparentemente no importa, así que solo usé un blanco opaco.

Establecer como fondo

En el diseño raíz de su elemento RecyclerView, establezca el fondo en la onda personalizada que creamos.

android:background="@drawable/custom_ripple"

En el proyecto de ejemplo con el que comenzamos, se ve así:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@drawable/custom_ripple" android:padding="10dp"> <TextView android:id="@+id/tvAnimalName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp"/> </LinearLayout>

Terminado

Eso es. Debería poder ejecutar su proyecto ahora. Gracias a esta respuesta y a este video de YouTube por ayuda.


Creo que hay un pequeño detalle que se pierde.

Si aún no obtiene el efecto dominó después de agregar android:background="?android:attr/selectableItemBackground" intente agregar estas líneas en la raíz del diseño.

android:clickable="true" android:focusable="true"

Esto asegurará que se pueda hacer clic en la vista y habilitará el efecto dominó con el atributo de fondo mencionado anteriormente


Me di cuenta de. Lo único que tuve que hacer es agregar este atributo:

android:background="?android:attr/selectableItemBackground"

al elemento raíz del diseño que mi adaptador RecyclerView infla así:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="8dp" android:paddingBottom="8dp" android:background="?android:attr/selectableItemBackground" tools:background="@drawable/bg_gradient"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="17sp" android:layout_marginLeft="15dp" android:layout_marginStart="15dp" android:id="@+id/shoppingListItem" android:hint="@string/enter_item_hint" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"/> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/shopping_list_item_checkbox_label" android:id="@+id/shoppingListCheckBox" android:layout_centerVertical="true" android:layout_marginRight="15dp" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:checked="false"/> </RelativeLayout>

Resultado: