Baserecyclerviewhelper執(zhí)行動畫很簡單,只需要調用openLoadAnimation函數(shù)并且傳入內置的動畫名就行了甫男。但是這個動畫執(zhí)行機制要么是重復執(zhí)行,要么是只執(zhí)行一次拘央,不滿足很多特殊情況式塌。
現(xiàn)在有一個需求是當有人發(fā)布了新的信息時,需要在列表的頂端插入新的信息缩多,并且執(zhí)行一個動畫呆奕。
- 閱讀Baserecyclerviewhelper的源碼养晋,我發(fā)現(xiàn)每次有數(shù)據(jù)綁定進來的時候都會執(zhí)行onViewAttachedToWindow函數(shù),所以我們只要在這個函數(shù)里面執(zhí)行動畫就可以了梁钾,需要注意的是绳泉,這個函數(shù)會被多次調用,并且需要執(zhí)行動畫的view有可能還未被渲染姆泻,所以我們需要做一下view的非空判斷零酪。
override fun onViewAttachedToWindow(holder: BaseViewHolder) {
super.onViewAttachedToWindow(holder)
if (mDatasize > 0) {
startanim(mDatasize)
}
}
fun setDataSize(datasize: Int){
mDatasize = datasize;
}
/**
* add animation when you want to show time
*
* @param holder
*/
public fun startanim(datasize:Int) {
for(position in 0..datasize-1){
var viewByPosition = getViewByPosition(position,R.id.rl_item_container)
if (viewByPosition != null) {
val scaleX = ObjectAnimator.ofFloat(viewByPosition, "scaleX", .5f, 1f)
val scaleY = ObjectAnimator.ofFloat(viewByPosition, "scaleY", .5f, 1f)
var rotation = ObjectAnimator.ofFloat(viewByPosition, "rotation", 0f, 15f, -15f, 0f)
//
var duration = ObjectAnimator.ofFloat(viewByPosition, "alpha", 0f, 1f).setDuration(800)
var animatorSet = AnimatorSet()
animatorSet.playTogether(scaleX,scaleY,rotation,duration)
animatorSet.setDuration(800)
animatorSet.start()
animatorSet.addListener(object : Animator.AnimatorListener{
override fun onAnimationRepeat(p0: Animator?) {
}
override fun onAnimationEnd(p0: Animator?) {
mDatasize = 0
}
override fun onAnimationCancel(p0: Animator?) {
}
override fun onAnimationStart(p0: Animator?) {
}
})
}
}
}