如何在Google plus / Google报摊上滚动回收视图?

时间:2015-01-27 22:33:36

标签: android scroll android-animation android-recyclerview

当项目第一次出现时以及用户滚动时,如何为RecyclerView设置动画,就像它对google plus app或google news stand app的工作方式一样。

另外,我在某处读到RecyclerView在用户滚动时不直接支持动画;如果这是真的,我们还有什么方法可以做到吗?

5 个答案:

答案 0 :(得分:75)

我是这样做的。可以帮助别人。我不知道这是否是最好的方式,但对我来说效果很好。

<强>更新 要修复快速滚动行为,请覆盖适配器的onViewDetachedFromWindow方法并在动画视图上调用clearAnimation(在本例中为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>

最后将此代码放在onBindViewHolder的{​​{1}}中。创建一个名为lastPosition的字段并将其初始化为-1。

recyclerView

答案 1 :(得分:5)

使用自定义ItemAnimator和“向上滑动”动画进行添加操作。 像这样 - https://github.com/wasabeef/recyclerview-animators

答案 2 :(得分:2)

对于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>

答案 3 :(得分:1)

https://github.com/wasabeef/recyclerview-animators

在我的代码中是这样的:

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));

}

您需要将依赖项添加到您的gradle

dependencies {
  // jCenter
  ...... 
  your curent dependencies 
  ....
  compile 'jp.wasabeef:recyclerview-animators:2.0.0'
}

阅读文档表格https://github.com/wasabeef/recyclerview-animators进行安装。

答案 4 :(得分:0)

在方法 onBindViewHolder 上的 RecycleView.Adapter 中没有任何外部库,请使用示例中的动画:

       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;
    }

上面的代码将从列表的每一行底部设置动画。动画只会进行一次,但onBindViewHolder在滚动时运行,所以第一次滚动列表将具有动画效果。

非常重要的是初始化视图以开始动画,因此在示例中我设置:

  holder.itemView.setTranslationY( + Y change);

然后动画回到原始位置:

 holder.itemView.animate().translationYBy(- Y change).start();

如果您需要alpha,请执行以下操作:

 holder.itemView.setAlpha(0);
 holder.itemView.animate().apha(1).start();