现在的一些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
设置监听器了,效果是一样的;
怎么样,简单吧~
网友评论