谈一谈为何写 OpenAnim
项目地址:https://gitee.com/kumei/OpenAnim
OpenAnim 是一个动画库,基于 Android 的属性动画的封装。
因为项目中遇到一些痛点,所有萌生了写这个库的想法:
1. 代码中经常使用同一个差值器 interpolate或者typeEvaluator,多个项目重复使用.
插值器(Interpolator)和估值器(TypeEvaluator)是实现 复杂动画效果的关键
interpolate 是什么:插值器,动画的变化速率,时快,时慢,是有节奏的。
系统内置的插值器有几个(可以自定义):
AccelerateInterpolator:动画从开始到结束,变化率是一个加速的过程。
DecelerateInterpolator:动画从开始到结束,变化率是一个减速的过程。
CycleInterpolator:动画从开始到结束,变化率是循环给定次数的正弦曲线。
AccelerateDecelerateInterpolator:动画从开始到结束,变化率是先加速后减速的过程。
LinearInterpolator:动画从开始到结束,变化率是线性变化。
… …
typeEvaluator 又是什么:估值器,决定 值 的变化规律(匀速、加速blabla),即决定的是变化趋势;
系统内置的估值器有3个(可以自定义):
IntEvaluator:以整型的形式从初始值 - 结束值 进行过渡
FloatEvaluator:以浮点型的形式从初始值 - 结束值 进行过渡
ArgbEvaluator:以Argb类型的形式从初始值 - 结束值 进行过渡
// 以前的代码,需要自己去简单封装一下的,感觉不是很解耦。
// OpenAnim 参考了类似 Glide 的 公共配置模块,去全局配置 插值器,估值器 等等参数.
public class TestAnimModule implements AnimModule {
@Override
public void applyOptions(@NonNull Context context, @NonNull AnimConfigBuilder builder) {
// builder.interpolate(new DecelerateInterpolator())
builder
// .duration(1000)
// .typeEvaluator(new BounceEaseOut(500))
.interpolate(new LinearInterpolator()); // 设置好插值器后,全局都会使用这个插值器.
}
}
// AndroidManifest.xml 中配置使用
<meta-data
android:name="AnimModule"
android:value="com.open.tvwidget.TestAnimModule" />
2. Activity, fragment, View 的生命周期如何绑定,使用了动画后每次都要自己释放,很烦
// 这里使用了 Lifecycle 来支持 生命周期监听.
// 使用者只需要传入 Context 就可,对于使用者是无感的.
OpenAnim.with(this/*Activity,Context等来自Context的类*/)
.into(mTestBtn)
.start();
3. 在使用了AnimatorSet后,动画循环次数,设置的很麻烦.
// 因为只有 继承了ValueAnimator,setRepeatCount 才方便设置,比如使用了 AnimatorSet 就不是很方便了。
OpenAnim.with(this)
.together(
new TranslationXAnimator(500),
new TranslationYAnimator(100))
.duration(3000)
.repeatCount(3) // 循环次数 : 1 ~ ValueAnimator.INFINITE(无限循环)
.start();
4. 经常使用ObjectAnimator,ValueAnimator…,每次都要写
// OpenAnim 将放大,移动 等等都封装起来了.
// MoveXAnimator,RotationAnimator,ScaleXAnimator,AlphaAnimator
OpenAnim.with(this)
.together(
new TranslationXAnimator(500),
new TranslationYAnimator(100))
.start();
4. 复杂的酷炫动画支持.
比如像下面这幅GIF显示的这种效果
还有这种效果
5. 支持XML动画