當前位置:
首頁 >
自定义RecyclerView动画——实现remove飞出效果
發布時間:2024/4/15
56
豆豆
生活随笔
收集整理的這篇文章主要介紹了
自定义RecyclerView动画——实现remove飞出效果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
前言
創建ItemAnimator
處理重疊
總結
源碼
前言
我們經常會遇到在一個list中刪除一條數據,這時候一般會有一個飛出的動畫效果,如下圖: 在RecyclerView中可以通過setItemAnimator函數設置一個ItemAnimator,實現item的add、remove、change等動作的動效。下面我們就通過ItemAnimator來實現上面的效果。創建ItemAnimator
首先創建一個類,繼承至SimpleItemAnimator,如下: class FlyAnimator extends SimpleItemAnimator{@Overridepublic boolean animateRemove(RecyclerView.ViewHolder holder) {return false;}@Overridepublic boolean animateAdd(RecyclerView.ViewHolder holder) {return false;}@Overridepublic boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) {return false;}@Overridepublic boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) {return false;}@Overridepublic void runPendingAnimations() {}@Overridepublic void endAnimation(RecyclerView.ViewHolder item) {}@Overridepublic void endAnimations() {}@Overridepublic boolean isRunning() {return false;} }SimpleItemAnimator是一個抽象類,需要實現幾個函數。
因為我們要實現是一個remove的動作,需要在animateRemove中處理。這里我們參照DefaultItemAnimator的做法,首先需要兩個list,然后在animateRemove將holder添加進list中,這里暫時不做處理,如下:
處理重疊
這是因為我們目前只定義了remove的效果,實際上不僅有飛出的動作還有一個上移的動作,所以還需要定義一下move的效果,同remove一樣需要兩個list,在animateMove函數中將holder添加至list中,如下: List<RecyclerView.ViewHolder> moveHolders = new ArrayList<>(); List<RecyclerView.ViewHolder> moveAnimators = new ArrayList<>(); @Override public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) {holder.itemView.setTranslationY(fromY - toY);moveHolders.add(holder);return true; } 注意在remove的一瞬間,下方的item實際上就已經上移了,所以在animateMove中設置item的translationY使其保持在未上移的位置。 然后同樣在runPedingAnimations中處理,這時runPedingAnimations代碼如下: @Override public void runPendingAnimations() {if(!removeHolders.isEmpty()) {for(RecyclerView.ViewHolder holder : removeHolders) {remove(holder);}removeHolders.clear();}if(!moveHolders.isEmpty()){for(RecyclerView.ViewHolder holder : moveHolders) {move(holder);}moveHolders.clear();} }這里move同樣是自定義的一個函數,代碼如下:
private void move(final MoveInfo moveInfo){moveAnimators.add(moveInfo);ObjectAnimator animator = ObjectAnimator.ofFloat(moveInfo.holder.itemView,"translationY", moveInfo.holder.itemView.getTranslationY(), 0);animator.setDuration(500);animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationStart(android.animation.Animator animation) {dispatchMoveStarting(moveInfo.holder);}@Overridepublic void onAnimationEnd(android.animation.Animator animation) {dispatchMoveFinished(moveInfo.holder);moveAnimators.remove(moveInfo.holder);if(!isRunning()) dispatchAnimationsFinished();}});animator.start(); } 執行了一個屬性動畫,修改了item的translationY使其上移回原位置。同時注意修改isRunning函數,如下: @Override public boolean isRunning() {return !(removeHolders.isEmpty() && removeAnimators.isEmpty() && moveHolders.isEmpty() && moveAnimators.isEmpty()); }這樣就實現了一開始的飛出效果。
總結
總結一下,其實自定義ItemAnimator比較簡單,雖然代碼接近百行,但其實主要就是執行動畫。需要注意的就是有些情況需要配合move的動作。 自定義ItemAnimator后,直接為RecyclerView設置即可: list.setItemAnimator(new FlyAnimator());設置后如果調用了adapter的notifyItemRemoved函數就會執行remove的動效。
源碼
關注公眾號:BennuCTech,發送“FlyAnimator”獲取完整源碼?
總結
以上是生活随笔為你收集整理的自定义RecyclerView动画——实现remove飞出效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动规避代码陷阱——自定义Lint规则
- 下一篇: java中四种线程池及poolSize、