android - itemanimator - ¿Cómo animar recyclerview en scroll como Google Plus/Google Newsstand?
recyclerview animation (5)
¿Cómo animo RecyclerView
cuando aparecen los elementos por primera vez y también cuando el usuario se desplaza, de la misma manera que funciona para la aplicación Google Plus o la aplicación Google News Stand?
También leí en alguna parte que RecyclerView
no admite directamente la animación cuando el usuario se desplaza; Si esto es cierto, ¿hay alguna manera de que podamos hacerlo?
Lo hice de esta manera. Podría ayudar a alguien. No sé si es la mejor manera de hacerlo pero funciona bien para mí.
ACTUALIZACIÓN: para corregir el comportamiento de desplazamiento rápido, anule el método onViewDetachedFromWindow
del adaptador y llame a clearAnimation
en la vista animada (en este caso, holder.itemView.clearAnimation()
). Me gusta esto:
@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
super.onViewDetachedFromWindow(holder);
holder.itemView.clearAnimation();
}
up_from_bottom.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="0%" android:toXDelta="0%"
android:fromYDelta="100%" android:toYDelta="0%"
android:duration="400" />
</set>
down_from_top.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="0%" android:toXDelta="0%"
android:fromYDelta="-100%" android:toYDelta="0%"
android:duration="400" />
</set>
Y finalmente ponga este código en onBindViewHolder
de recyclerView
. Cree un campo llamado lastPosition e inicialícelo en -1.
Animation animation = AnimationUtils.loadAnimation(context,
(position > lastPosition) ? R.anim.up_from_bottom
: R.anim.down_from_top);
holder.itemView.startAnimation(animation);
lastPosition = position;
Para down_from_top.xml debería ser
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="0%" android:toXDelta="0%"
android:fromYDelta="-100%" android:toYDelta="0%"
android:duration="400" />
</set>
Sin ninguna biblioteca externa en RecycleView.Adapter en el método onBindViewHolder use la animación como en el ejemplo:
if (position>lastAnimatedPosition) {
//set init transitionY to animate from it
holder.itemView.setTranslationY(holder.itemView.getHeight());
//animate to orginal position
holder.itemView.animate().translationYBy(- holder.itemView.getHeight()).start();
lastAnimatedPosition=position;
}
El código anterior animará desde la parte inferior de cada fila en la lista. La animación se realizará solo una vez, pero onBindViewHolder se ejecuta en el desplazamiento, por lo que el primer desplazamiento de la lista se realizará con el efecto de animación.
Es muy importante inicializar la vista al inicio de la animación, por lo que en el ejemplo, establezco:
holder.itemView.setTranslationY( + Y change);
Luego la animación vuelve a su posición original:
holder.itemView.animate().translationYBy(- Y change).start();
Si necesitas alfa hazlo de esta manera:
holder.itemView.setAlpha(0);
holder.itemView.animate().apha(1).start();
Use el animador de elementos personalizado con animación "deslizar hacia arriba" para la acción Agregar. Me gusta esto - https://github.com/wasabeef/recyclerview-animators
https://github.com/wasabeef/recyclerview-animators
En mi código hay algo como esto:
import jp.wasabeef.recyclerview.animators.adapters.AlphaInAnimationAdapter;
....
public function populate() {
// Get your recicleview
rv = (RecyclerView)findViewById(R.id.rv);
rv.setHasFixedSize(true);
// Populate your cursor with your own method...
Cursor myRecycleItems= null;
myRecycleItems= mDbHelper.getItems();
//create your
itemsAdapter= new ItemsAdapter(myRecycleItems, getApplicationContext());
//Finnaly apply your adapter to RV with AlphaInAnimationAdapter:
rv.setAdapter(new AlphaInAnimationAdapter(itemsAdapter));
}
Necesitas añadir dependencias a tu gradle.
dependencies {
// jCenter
......
your curent dependencies
....
compile ''jp.wasabeef:recyclerview-animators:2.0.0''
}
Lea el formulario de documento https://github.com/wasabeef/recyclerview-animators para instalarlo.