美文网首页
RecyclerView的item中使用动画导致卡顿问题解决方案

RecyclerView的item中使用动画导致卡顿问题解决方案

作者: 设计失 | 来源:发表于2019-12-12 11:11 被阅读0次

现在的一些APP,为了吸引用户的眼光,界面做得非常炫目;这可给本来头发不多的程序员下了一道难题了;最近在写一个列表item,里面使用了一些动画,滑动的时候会感觉不那么丝滑;作为多年的老司机,这一看就知道页面渲染过多的动画所导致的,稍不注意可能还会出现我们最怕的OOM

来,先看看页面:


优化过的列表.gif

这是我们公司的APP, 一般做直播或者社交软件的APP都会像这样的列表,添加许多的动画来吸引用户的眼球;当然,当前页面只是简单的demo, 感兴趣的朋友可以进入下载:http://www.zhadanyu.com/, 以后的文章也会对当前项目持续优化!

好了,我们来分析一下:

首先,这是一个多item布局,这里不作多的解释,一般的做法都是使用一个itemViewType, 然后对不同的item做不同的操作,当然,如果你的项目中使用了data-binding这一神器,写起项目来会如鱼得水,当然,data-binding对后期维护也是非常困难的,这是比较大的缺点了。

这样的问题解决起来很简单,如果我们自己观察的话,页面动画太多,那就只需要对屏幕之外的动画进行移除或者停止即可,只有对加入屏幕的动画进行播放即可;

使用Fragment的时候我们知道会使用onAttachFragment()或者'onDetach()'方法来做一些操作,这两个方法就是当页面渲染或者离开屏幕的时候调用的,而view中也有类似的方法:addOnAttachStateChangeListener(),
所以,我们只需要在不同的item中使用监听器来监听是否在屏幕中显示即可:

LottieAnimationView animationView = helper.getView(R.id.item_party_normal_animation_iv);
if (animationView.getTag() != null) {
    DbLogUtil.e("normal 移除监听器");
    animationView.removeOnAttachStateChangeListener((View.OnAttachStateChangeListener) helper.getView(R.id.item_party_normal_animation_iv).getTag());
}
View.OnAttachStateChangeListener onAttachStateChangeListener = new View.OnAttachStateChangeListener() {
    @Override
    public void onViewAttachedToWindow(View v) {
        animationView.playAnimation();
    }
    @Override
    public void onViewDetachedFromWindow(View v) {
        animationView.pauseAnimation();
    }
};
DbLogUtil.e("normal 添加监听器");
animationView.addOnAttachStateChangeListener(onAttachStateChangeListener);
animationView.setTag(onAttachStateChangeListener);

当然,你也可以对整条item设置tag, 但是我们的项目中使用了databinding, 多条目的时候使用了item来设置tag,所以,只能对item中的子view设置监听器了,效果是一样的;

怎么样,简单吧~

相关文章

网友评论

      本文标题:RecyclerView的item中使用动画导致卡顿问题解决方案

      本文链接:https://www.haomeiwen.com/subject/xvvzgctx.html