Comment puis-je animer la RecyclerView
lorsque les éléments apparaissent pour la première fois et également lorsque l'utilisateur fait défiler, exactement comme cela fonctionne pour l'application Google Plus ou l'application Google News Stand.
De plus, j'ai lu quelque part que RecyclerView
ne prend pas directement en charge l'animation lorsque l'utilisateur fait défiler; si cela est vrai, est-il possible de le faire?
Je l'ai fait de cette façon. Peut aider quelqu'un. Je ne sais pas si c'est la meilleure façon de le faire mais cela fonctionne bien pour moi.
UPDATE: Pour résoudre le problème du défilement rapide, substituez la méthode onViewDetachedFromWindow
de l'adaptateur et appelez clearAnimation
sur la vue animée (dans ce cas, holder.itemView.clearAnimation()
).
@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>
Et enfin, mettez ce code dans onBindViewHolder
de recyclerView
. Créez un champ appelé lastPosition et initialisez-le à -1.
Animation animation = AnimationUtils.loadAnimation(context,
(position > lastPosition) ? R.anim.up_from_bottom
: R.anim.down_from_top);
holder.itemView.startAnimation(animation);
lastPosition = position;
Utilisez ItemAnimator personnalisé avec une animation "glisser vers le haut" pour l'action Add ... .. comme ceci - https://github.com/wasabeef/recyclerview-animators
Pour down_from_top.xml, cela devrait être
<?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>
https://github.com/wasabeef/recyclerview-animators
Dans mon code est quelque chose comme ceci:
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));
}
Vous devez ajouter des dépendances à votre diplôme
dependencies {
// jCenter
......
your curent dependencies
....
compile 'jp.wasabeef:recyclerview-animators:2.0.0'
}
Lisez le formulaire doc https://github.com/wasabeef/recyclerview-animators pour l'installer.
Sans aucune bibliothèque extérieure dans RecycleView.Adapter, la méthode onBindViewHolder utilise une animation comme dans l'exemple:
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;
}
Le code ci-dessus s'animera à partir du bas de chaque ligne de la liste. L'animation ne sera effectuée qu'une fois, mais onBindViewHolder s'exécute en défilement. Le premier défilement de la liste s'effectue alors avec un effet d'animation.
Il est très important d’initialiser la vue au début de l’animation. Par exemple, j’ai défini:
holder.itemView.setTranslationY( + Y change);
puis l'animation retourne à la position initiale:
holder.itemView.animate().translationYBy(- Y change).start();
Si vous avez besoin d’alpha, procédez comme suit:
holder.itemView.setAlpha(0);
holder.itemView.animate().apha(1).start();