如果覺得自定義比較繁瑣,github上也有相關的動畫實現:
接下來我們將一步步分析這個實現類,最後在它的基礎上修改預設的動畫效果。
先來看defaultitemanimator
中的幾個重要的方法:
void runpendinganimations()
:當有動畫需要執行時呼叫。
boolean isrunning()
:返回當前是否有動畫正在執行。
boolean animateadd()
:新增元素時呼叫,通常返回true。
boolean animateremove()
:移除資料時呼叫。
boolean animatemove()
:列表項位置移動時呼叫。
boolean animatechange()
:列表項資料發生改變時呼叫。
void endanimation()
:當某個動畫需要被立即停止時呼叫,這裡一般做檢視的狀態恢復。
void endanimations()
作用同上,區別是停止多個動畫時呼叫。
認識了八個主要的方法,我們再來看看具體的動畫是如何實現的,我們從新增元素動畫開始(其他動畫的執行流程基本類似),當有新的元素新增進來時,首先呼叫animateadd(viewholder holder)
:
@override
public
boolean
animateadd(final viewholder holder)
@override
public
void
endanimation(viewholder item) }}
}
}
@override
public
void
runpendinganimations()
// 省略部分**...
if (additionspending)
additions.clear();
madditionslist.remove(additions);}};
if (removalspending || movespending || changespending) else }}
我們接著看runnable
中animateaddimpl(holder)
這個方法的實現:
private
void
animateaddimpl(final viewholder holder)
/*** 如果是淡出的刪除動畫,需要在這裡將item的狀態恢復正常
* viewcompat.setalpha(view, 1)
*/@override
public
void
onanimationend(view view)
}).start();
}/**
*/private
void
dispatchfinishedwhendone()
}
至此我們大致走了一遍新增元素動畫的流程,回過頭來看,如果說我們需要在這個基礎新增乙個從縮放動畫只需要修改幾個個地方即可:
/**
* 設定初始狀態
*/@override
public
boolean
animateadd(final viewholder holder)
/*** 設定終止狀態
*/private
void
animateaddimpl(final viewholder holder)
}
// 省略部分**...
}
/**
*/@override
public
void
endanimation(viewholder item)
}/**
* 當動畫被取消時,也需要恢復至正常狀態
*/private
void
animateaddimpl(final viewholder holder)
}
// 省略部分**...
}
再次執行:
自定義刪除、移動、更新動畫的流程與上面大致相同,結合旋轉,平移,縮放等可以實現豐富的動畫效果。
RecyclerView 快取機制詳解
recyclerview據官方的介紹,該控制項用於在有限的視窗中展示大量資料集,其實這樣功能的控制項我們並不陌生,例如 listview gridview。recyclerview可以用來代替傳統的listview,gridview,更加強大和靈活。recyclerview的使用網上有非常多案例,這...
RecyclerView頂部重新整理實現詳解
recyclerview頂部重新整理的實現通常都是在recyclerview外部再包裹一層布局。在這個外層布局中,還包含乙個自定義的view,作為頂部重新整理時的指示view。也就是說,外層布局中包含兩個child,乙個頂部重新整理view,乙個recyclerview,頂部重新整理view預設是隱...
RecyclerView詳解 自定義動畫
google為我們提供了乙個預設的動畫實現 defaultitemanimator 當資料新增 刪除 更新時,會觸發預設的動畫效果 通過本篇的學習,我們可以得到下面的效果 如果覺得自定義比較繁瑣,github上也有相關的動畫實現 接下來我們將一步步分析這個實現類,最後在它的基礎上修改預設的動畫效果。...