以下是读Android自定义控件三部曲文章索引 - 启舰 - CSDN博客的一些笔记和个人理解。正在更新中...
ValueAnimator
个人理解,就像AE里的controller,他作为一个控制杆,实际动画需要通过其值的映射变动来控制,也可以理解成他是动画的进度。系统给出了默认的两个控制杆:ofInt,ofFloat。
- Interpolator:插值器,控制ValueAnimator数字变化的加速度。
- AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
- AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
- AnticipateInterpolator 开始的时候向后然后向前甩
- AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
- BounceInterpolator 动画结束的时候弹起
- CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
- DecelerateInterpolator 在动画开始的地方快然后慢
- LinearInterpolator 以常量速率改变
- OvershootInterpolator 向前甩一定值后再回到原来位置
当然我们也可以自定义求值程序。
- Evaluator:求值程序,控制ValueAnimator数字与实际变化的映射,系统给出了默认程序ArgbEvalutor(颜色变化),IntEvaluator,FloatEvalutor,当然我们也可以自定义求值程序。
public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values);
有了以上两个概念,我们就可以自定义了控制杆了。
ofObject: ValueAnimator ofObject(TypeEvaluator evaluator, Object... values);
ObjectAnimator
ValueAnimator有个缺点,就是只能对数值对动画计算。我们要想对哪个控件操作,需要监听动画过程,在监听中对控件操作。这样使用起来相比补间动画而言就相对比较麻烦。 ObjectAnimator可以直接对属性进行操作,只要对应的控件有相对应的setXXXX(propertyName)方法即可。
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
PropertyValuesHolder
我们可以创建动画的Holder,ofPropertyValuesHolder将这些我们定义的Holder组合到一个组件上。从而实现了多个动画的组合。
public static ObjectAnimator ofPropertyValuesHolder(Object target, PropertyValuesHolder... values)
关键帧 Keyframe
关键帧,和AE里的概念是一模一样的。定义某个时间点,动画的进度。剩下的补间动画交给系统去实现。
public static Keyframe ofFloat(float fraction)
public static Keyframe ofFloat(float fraction, float value)
/**
* ofInt
*/
public static Keyframe ofInt(float fraction)
public static Keyframe ofInt(float fraction, int value)
/**
* 设置fraction参数,即Keyframe所对应的进度
*/
public void setFraction(float fraction)
/**
* 设置当前Keyframe所对应的值
*/
public void setValue(Object value)
/**
* 设置Keyframe动作期间所对应的插值器
*/
public void setInterpolator(TimeInterpolator interpolator)
当然关键帧也可以设置插值器,这个道理和AE里也是一样的。(学过AE理解起来真方便)
联合动画 playSequentially,playTogether,AnimatorSet.Builder
多个组件共同一起播放动画,playSequentially 是线性顺序,playTogether 是并行动画。
AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playSequentially(tv1BgAnimator,tv1TranslateY,tv2TranslateY);
animatorSet.setDuration(2000); animatorSet.start();
AnimatorSet.Builder就更自由了,随意组合动画播放
AnimatorSet animatorSet = new AnimatorSet();
AnimatorSet.Builder builder = animatorSet.play(tv1BgAnimator);
builder.with(tv1TranslateY);
//或者
animatorSet.play(tv1TranslateY).with(tv2TranslateY).after(tv1BgAnimator);
//和前面动画一起执行
public Builder with(Animator anim)
//执行前面的动画后才执行该动画
public Builder before(Animator anim)
//执行先执行这个动画再执行前面动画
public Builder after(Animator anim)
//延迟n毫秒之后执行动画
public Builder after(long delay)
网友评论