【问题标题】:How to animate recyclerview on scroll like Google plus/Google newsstand?如何在像谷歌加/谷歌报摊这样的滚动上为回收站设置动画?
【发布时间】:2015-03-26 16:57:54
【问题描述】:

我如何在项目首次出现以及用户滚动时为 RecyclerView 设置动画,就像它在 google plus 应用程序或 google news stand 应用程序中的工作方式一样。

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

【问题讨论】:

    标签: android scroll android-animation android-recyclerview


    【解决方案1】:

    我是这样做的。可能会帮助某人。我不知道这是否是最好的方法,但对我来说效果很好。

    更新: 要修复快速滚动行为,请覆盖适配器的 onViewDetachedFromWindow 方法并在动画视图上调用 clearAnimation(在本例中为 holder.itemView.clearAnimation() )。像这样:

     @Override
    public void onViewDetachedFromWindow(@NonNull 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>
    

    最后把这段代码放在recyclerView的onBindViewHolder中。创建一个名为 lastPosition 的字段并将其初始化为 -1。

    Animation animation = AnimationUtils.loadAnimation(context,
                (position > lastPosition) ? R.anim.up_from_bottom
                        : R.anim.down_from_top);
        holder.itemView.startAnimation(animation);
        lastPosition = position;
    

    【讨论】:

    • 有什么办法可以快速处理滚动它搞砸了
    • @naiyu 抱歉不知道。
    • 要修复快速滚动行为,请在适配器上实现onViewDetachedFromWindow 并在动画视图上调用clearAnimation(在您的情况下为holder.itemView)。
    • 它可以工作..但是当我们使用延迟加载时不能正常工作..还有其他选择吗?
    • 成功了!我遇到了一个无限滚动的小问题。通过不在第一个位置运行动画来解决。
    【解决方案2】:

    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 进行安装。

    【讨论】:

    • 它对我不起作用 RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.scrollableview); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setAdapter(new SlideInBottomAnimationAdapter(new ComplexRecyclerViewAdapter(items)));
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在方法 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();
      

      【讨论】:

        猜你喜欢
        • 2011-12-19
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多