Android 自定义动画笔记

以下是读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)

猜你喜欢

转载自blog.csdn.net/weixin_34274029/article/details/87560219