RecyclerView里的itemView有循环动画时,如何控制动画链条与itemView的生命周期同步

目的:记录业务需求中需要注意的地方,以免下次碰到相同需求,还需要重新整理思路,特别耽误时间.   把一条需求的细节及实现方式分析清楚,其它类似需求 都值得 借鉴, 都是对 动画链条 与 itemView的生命周期的 同步控制.

需求描述: 在recyclerView列表中的 某一个item 内有 循环动画, 如下图所示,这是一个多type的 RecyclerView,图中红框的部分为其中一个type对应的 itemView的界面, 在这个itemView上 需要 循环展示 服务器返回的 N条数据,每条数据展示2秒钟,2秒后当前展示的数据界面View的透明度从 1.0f过度到0.0f, 动画持续时间为1秒;隐藏动画执行完成后,下一条数据的界面View的透明度从 0.0f 过度到 1.0f,显示动画持续1秒。  以此类推,完全显示2秒后,再显示下一条数据...



最容易想到的思路 :

1、在 RecyclerView.Adapter 的 onBindViewHolder 中 添加 itemView的 onAttach 和 onDettach 的 监听, 当此item  attach到 界面上时, new Handler().postDelay( 隐藏动画的Runnable, 2秒);

2、隐藏动画执行完成后,执行显示下一项数据的动画

3、显示动画执行完成后,又回到第一步。  这样1、2、3步就构成一个 动画播放的链条,循环执行


大致的步骤确实如上所述,但有细节需要注意

需要注意的问题:

当这一项itemView滚动离开屏幕时,即onDettach调用时,就需要中断当前的动画播放链条。  否则 再次滑回来显示时,即onAttach时,又会开启一条的新的 动画播放链条,这就导致ui动画错乱。


分析

那问题的关键在于 onDetach时 需要取消当前的 动画播放链条, 我们来分析一下  onDetach时有哪些情况

1、detach时,已经有 发出了一个 延时2秒执行的Runnable,但还未到2秒,即runnable还未执行
2、detach时,延时2秒的Runable 已经执行了, 正处于 隐藏动画的执行阶段
3、detach时,延时2秒的Runable 已经执行了, 并且隐藏动画执行完毕,现在正处于 下一项的显示动画的执行阶段
4、detach时,延时2秒的Runable 已经执行了, 并且隐藏动画执行完毕,并且显示下一项的显示动画也执行完毕;显示动画完毕后又回第1步,延时2秒执行隐藏动画的Runnable


结论

我们只需要保证在 onDetach时,以上四种情况的 动画播放链条  都能被中止,  这样在 onAttach 时 就 放心的 重新 开启新的 动画播放链条。

伪代码,   注意你的 runnable、dimissAnimator、showAnimator 必须是 ViewHolder 里持有的 同一个对象,最好以成员变量来持有

void onDetach(){
    new Handler().removeCallbacks( 延时2秒执行隐藏动画的Runnable );
    dimissAnimaotr.cancel(); // 注意要调cancel,而不是 end(), 因为end会回调 endListener, 而endListener里又会开启 showAnimator
    showAnimator.cacel(); // 注意要调cancel,而不是end,原因同上
}


猜你喜欢

转载自blog.csdn.net/u013394527/article/details/80078723