2

私は、のRecyclerViewを使用しています。 スクロールするときにアイテムの高さをRecyclerViewに変更したい場合は、スクロールアップするときに元の高さに戻ってください。スクロールするときに、どのようにrecyclerviewアイテムをアニメートできますか?

私はすでに同じリスナーのbottomBarをアニメーション化していますが、RecyclerViewのすべてのアイテムをアニメーション化する方法を理解できません。 forループを試してみましたが、私は正しいアイデアはないと思います。

public abstract class RecyclerViewOnScrollListener extends RecyclerView.OnScrollListener { 

    private LinearLayout bottomBarContainer; 
    private boolean animateItems = false; 
    CardStackLayoutManager cardStackLayoutManager; 
    public RecyclerViewOnScrollListener(LinearLayout bottomBarContainer) { 
     this.bottomBarContainer = bottomBarContainer; 
    } 

    public RecyclerViewOnScrollListener(LinearLayout bottomBarContainer, boolean animateItems, CardStackLayoutManager cardStackLayoutManager) { 
     this.bottomBarContainer = bottomBarContainer; 
     this.animateItems = animateItems; 
     this.cardStackLayoutManager = cardStackLayoutManager; 
    } 

    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 

     if (bottomBarContainer==null || dy==0) { 
      return; 
     } 
     long ANIMATION_DURATION = 200L; 
     if (dy>0) { // Scrolling to bottom 

      if (mIsScrollDirectionLocked && mScrollingDirection!=0) return; 

      if (bottomBarContainer.getVisibility()== View.GONE || mIsAnimatingOff) { 
       return; 
      } else { 
       for(int i = 0;i < cardStackLayoutManager.getChildCount();i++) 
       { 
        View view = cardStackLayoutManager.getChildAt(i); 
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view,"y",0f,200f); 
        objectAnimator.setDuration(150); 
        objectAnimator.start(); 
       } 
       mScrollingDirection = SCROLLING_DOWN; 
       mIsAnimatingOff = !mIsAnimatingOff; 

       ViewCompat.setTranslationY(bottomBarContainer, 0F); 

       ViewCompat.animate(bottomBarContainer) 
         .translationY(bottomBarContainer.getHeight()) 
         .setDuration(ANIMATION_DURATION) 
         .setListener(new ViewPropertyAnimatorListenerAdapter() { 
          @Override 
          public void onAnimationEnd(View view) { 
           mIsAnimatingOff = !mIsAnimatingOff; 
           bottomBarContainer.setVisibility(View.GONE); 
          } 
         }).start(); 

      } 
     } else { // Scrolling to top 
      if (mIsScrollDirectionLocked && mScrollingDirection!=0) return; 

      if (bottomBarContainer.getVisibility()!=View.VISIBLE && !mIsAnimatingOn) { 

       mScrollingDirection = SCROLLING_UP; 
       mIsAnimatingOn = !mIsAnimatingOn; 
       bottomBarContainer.setVisibility(View.VISIBLE); 
       for(int i = 0;i < cardStackLayoutManager.getChildCount();i++) 
       { 
        View view = cardStackLayoutManager.getChildAt(i); 
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view,"y",200f,0f); 
        objectAnimator.setDuration(150); 
        objectAnimator.start(); 
       } 
       ViewCompat.setTranslationY(bottomBarContainer, bottomBarContainer.getHeight()); 

       ViewCompat.animate(bottomBarContainer) 
         .translationY(0F) 
         .setDuration(ANIMATION_DURATION) 
         .setListener(new ViewPropertyAnimatorListenerAdapter() { 
          @Override 
          public void onAnimationEnd(View view) { 
           mIsAnimatingOn = !mIsAnimatingOn; 
          } 
         }).start(); 
      } 
     } 
    } 

    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     super.onScrollStateChanged(recyclerView, newState); 
     if (!mIsScrollDirectionLocked) return; 

     switch (newState) { 
      case RecyclerView.SCROLL_STATE_IDLE: 
       mScrollingDirection = 0; 
       break; 
      default: 
       break; 
     } 
    } 

    private static final int SCROLLING_UP = 1; 

    private static final int SCROLLING_DOWN = 2; 

    private int mScrollingDirection = 0; 

    private boolean mIsScrollDirectionLocked = false; 

    private boolean mIsAnimatingOff = false; 

    private boolean mIsAnimatingOn = false; 

} 

答えて

0

は、以下のようなあなたのConvertViewをアニメーション化する方法を定義します。

private void setAnimation(View viewToAnimate,int position) { 
     if (position > lastPosition) { 
     lastPosition = position; 
     Animation animation = AnimationUtils.loadAnimation(activity, R.anim.anim_content); 
     viewToAnimate.startAnimation(animation); 
     } 
} 

そして、あなたのアダプタのonBindViewHolder方法であなたのアニメーションメソッドを呼び出します(anime_content.xml:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    // Do your initialization 
    setAnimation(holder.convertView, position); 
} 

ここでアニメーションです)

<?xml version="1.0" encoding="utf-8"?> 
<translate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:fromYDelta="25%p" 
    android:toYDelta="0%p" 
    android:duration="300" 
    android:interpolator="@android:anim/decelerate_interpolator" /> 

この例では、最後に膨らんだリサイクルビューの行を下から上にアニメーション表示します。どのくらいの頻度でアニメーションを変更することができます。

Good Luck!

+0

こんにちは、ありがとうございます。この実装は、recyclerViewアイテムが最初に膨らんだときにのみ機能します。 onScrollに応答するアニメーションがほしいと思った。スクロールアップ時に高さを上げたり、スクロール時に高めたりするようにしたい – DoM4

+1

はい、これは、recyclerviewのアニメーション実装を膨らませる行です。 – savepopulation

+0

reclyclerviewをスクロールするときに、膨らんだビューをアニメーション化するためのものを探していました – DoM4

関連する問題