2

Я использую RecyclerView с обычным RecyclerViewOnScrollListener. Я бы хотел изменить высоту элемента RecyclerView при прокрутке вниз и вернуться к исходной высоте при прокрутке вверх.Как вы можете анимировать элементы recyclerview при прокрутке?

Я уже анимировал нижнюю панель в том же слушателе, но я не могу понять, как оживить каждый элемент в 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 метод адаптера назвать ваш анимации метод:

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

Вот анимация: (anime_content.xml)

<?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" /> 

В этом примере будет отображаться ваша последняя раздутая строка просмотра ресайклеров с самого начала. Вы можете изменить свою анимацию, как хотите.

Удачи!

+0

Привет, Спасибо за ваш ответ. Эта реализация работает только при первом запуске элемента recyclerView. Я хотел, чтобы анимация реагировала на onScroll. Как увеличение высоты при прокрутке вниз и уменьшении при прокрутке вверх – DoM4

+1

Да, это реализация анимации раздувания строк для recyclerview. – savepopulation

+0

Я искал что-то, чтобы оживить завышенный вид при прокрутке reclyclerview – DoM4

 Смежные вопросы

  • Нет связанных вопросов^_^