摘要:的设计策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。在此采用的是策略模式这样更加灵活,如果需要自定义一个自己的动画,只需要继承实现方法即可。
效果如何? 如何使用?上篇「RecyclerView.Adapter优化了吗?」主要讲了RecyclerView.Adapter的优化代码以及添加了item的click方法具体实现原理,这篇在原来的基础上新增列表动画,后续还会扩展更多功能,供大家学习,支持我就Star一下「BaseRecyclerViewAdapterHelper」。
// 一行代码搞定(默认为渐显效果) quickAdapter.openLoadAnimation();
如果你想换成别的效果你也可以
// 默认提供5种方法(渐显、缩放、从下到上,从左到右、从右到左) quickAdapter.openLoadAnimation(BaseQuickAdapter.ALPHAIN);
如果还是不满意则可以自定义效果
quickAdapter.openLoadAnimation(new BaseAnimation() { @Override public Animator[] getAnimators(View view) { return new Animator[]{ ObjectAnimator.ofFloat(view, "scaleY", 1, 1.1f, 1), ObjectAnimator.ofFloat(view, "scaleX", 1, 1.1f, 1) }; } });
使用就是如此简单。
如何做到的?首先先思考两个问题
添加动画在哪个方法里面添加?
如何控制动画加载次数?
添加动画在哪个方法里面添加?onBindViewHolder方法,因为每次填充数据的时候都会调用该方法。
private int mDuration = 300; public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { // 此处代码省略,代码已经在上篇详细讲解过了 if (isOpenAnimation) { BaseAnimation animation = null; if (customAnimation != null) { animation = customAnimation; }else{ animation = selectAnimation; } for (Animator anim : animation.getAnimators(holder.itemView)) { anim.setDuration(mDuration).start(); anim.setInterpolator(mInterpolator); } } }
以上代码,首先判断是否开启动画,然后判断是否是自定义动画还是用户选择的自带动画,然后对动画的操作元素进行遍历执行,执行时间为300毫秒,由于上面说了每次填充数据都会调用,所以如何不判断的话,就会导致上下滑动每次都会重复调用动画,动画本身是会耗费性能的。
如何控制动画加载次数?private int mDuration = 300; private int mLastPosition = -1; private boolean isFirstOnly = true; public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { // 此处代码省略,代码已经在上篇详细讲解过了 if (isOpenAnimation) { if (!isFirstOnly || position > mLastPosition) { BaseAnimation animation = null; if (customAnimation != null) { animation = customAnimation; }else{ animation = selectAnimation; } for (Animator anim : animation.getAnimators(holder.itemView)) { anim.setDuration(mDuration).start(); anim.setInterpolator(mInterpolator); } mLastPosition = position; } } } public void setFirstOnly(boolean firstOnly) { isFirstOnly = firstOnly; }
只需要添加一个mLastPosition来存储滑动过的位置,然后判断滑动的位置是否被滑动过,这样就可以避免每次都添加动画了。不过为了满足喜欢动画多过于性能的开发者,如果你想要每次滑动都带动画可以设置isFirstOnly属性即可,默认是不开启的。
Animation的设计 BaseAnimationpublic abstract class BaseAnimation { public abstract Animator[] getAnimators(View view); }AlphaInAnimation
public class AlphaInAnimation extends BaseAnimation { private static final float DEFAULT_ALPHA_FROM = 0f; private final float mFrom; public AlphaInAnimation() { this(DEFAULT_ALPHA_FROM); } public AlphaInAnimation(float from) { mFrom = from; } @Override public Animator[] getAnimators(View view) { return new Animator[]{ObjectAnimator.ofFloat(view, "alpha", mFrom, 1f)}; } }
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
在此采用的是「策略模式」,这样更加灵活,如果需要自定义一个自己的动画,只需要继承BaseAnimation实现getAnimators方法即可。
public class CustomAnimation extends BaseAnimation { @Override public Animator[] getAnimators(View view) { return new Animator[]{ ObjectAnimator.ofFloat(view, "scaleY", 1, 1.1f, 1), ObjectAnimator.ofFloat(view, "scaleX", 1, 1.1f, 1) }; } }
设置即可
quickAdapter.openLoadAnimation(new CustomAnimation());小知识 openLoadAnimation方法
public void openLoadAnimation(@AnimationType int animationType)
在写这个方法的时候,想是不是用枚举更合适?但是曾看过多篇性能优化的文章不推荐Enum枚举,因为性能消耗,其实Android有自带的枚举
官方文档说明,安卓开发应避免使用Enum(枚举类),因为相比于静态常量Enum会花费两倍以上的内存。
Android推荐,以下写法
//先定义 常量 public static final int SUNDAY = 0; public static final int MONDAY = 1; public static final int TUESDAY = 2; public static final int WEDNESDAY = 3; public static final int THURSDAY = 4; public static final int FRIDAY = 5; public static final int SATURDAY = 6; //默认参数 @WeekDays int currentDay = SUNDAY; //用@IntDef "包住" 常量; // @Retention 定义策略 // 声明构造器 @IntDef({SUNDAY, MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}) @Retention(RetentionPolicy.SOURCE) public @interface WeekDays {} //设置参数 public void setCurrentDay(@WeekDays int currentDay) { this.currentDay = currentDay; }
详细文章可查看
下拉框的引用aar包是 Android 的类库项目的二进制发行包。
下拉框引用到别人的工程,引用方式是「arr包」
每次收获一点点,后续还会扩展更多功能,供大家学习,支持我就Star一下「BaseRecyclerViewAdapterHelper」。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/12886.html
摘要:如果想指定可以拖拽,需要重写返回,在的长按监听事件里调用开启拖拽是否支持滑动操作,默认是支持返回。实例分别把中间所有的的位置重新交换滑动时改变的透明度添加接口指定页卡滑动一次能滑动多页一次只能滑动一页引用 在项目的build.gradle添加依赖 compile com.android.support:recyclerview-v7:23.4.0 RecyclierView使用的基本方法...
摘要:可以说领域是最难以有新突破的地方了,似乎能做的只是在现有基础上小修小改而已了。也是由于需要单独写,而这些小类抽象度低,该界面的逻辑被迫分离到了这些小类中,即使是业务联系很大的逻辑功能过于繁杂,抽象度低。 DslAdapter开发简介 DslAdapter是一个Android RecyclerView的Adapter构建器, DSL语法, 面向组合子设计. 专注类型安全, 所有代码采用K...
摘要:什么是策略模式说到设计模式一般人像我一样的新鸟们首先想到的是单例模式哇单例模式又是什么假设有个需求有四种计算方法输出输入其中使用单例模式如下这么做的话会保证一个类仅有一个实例并提供一个访问它的全局访问点但是问题来了如果我有成百上千的方法会特 什么是策略模式? 说到设计模式, 一般人(像我一样的新鸟们)首先想到的是单例模式!. 哇, 单例模式又是什么? ....^&^%^ 假设有个需求:...
摘要:策略模式策略模式指的是定义一系列的算法,把它们一个个封装起来,将不变的部分和变化的部分隔开,实际就是将算法的使用和实现分离出来这样就能避免很多的条件判断并且增强了代码的复用性其中包含一个策略类和一个环境类计算奖金的例子策略类环境类设置原始工 策略模式 策略模式指的是 定义一系列的算法,把它们一个个封装起来,将不变的部分和变化的部分隔开,实际就是将算法的使用和实现分离出来, 这样就能避...
摘要:本文总结了前端老司机经常问题的一些问题并结合个人总结给出了比较详尽的答案。网易阿里腾讯校招社招必备知识点。此外还有网络线程,定时器任务线程,文件系统处理线程等等。线程核心是引擎。主线程和工作线程之间的通知机制叫做事件循环。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文总结了前端老司机经常问题的一些问题并结合个...
阅读 1875·2023-04-25 18:49
阅读 1723·2019-08-30 14:02
阅读 2492·2019-08-29 17:24
阅读 3208·2019-08-28 18:10
阅读 2716·2019-08-28 18:03
阅读 328·2019-08-26 12:01
阅读 3182·2019-08-26 11:31
阅读 1000·2019-08-26 10:29