ddu- 属性动画

常用方法:

ValueAnimator

  • 常用方法ValueAnimator.ofInt(1,100),ValueAnimator.ofFloat(0f, 1f); ValueAnimator.ofObject();
    setStartDelay()方法来设置动画延迟播放的时间
    调用setRepeatCount()和setRepeatMode()方法来设置动画循环播放的次数以及循环播放的模式,
    循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思

  • 它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等
    ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);//创建一个ValueAnimator 对象
    anim.setDuration(300);
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
    float currentValue = (float) animation.getAnimatedValue();

         }
     });
     anim.start();
    
  • 0和1就表示将值从0平滑过渡到1

  • ofFloat()参数是一个不定长,还可以ValueAnimator.ofFloat(0f, 4f, 2f, 10f); 表示一个值在5秒内从0过渡到4,再过渡到2,再过渡到10.

ObjectAnimator

它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的。

      ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f);  //透明度变化
      animator.setDuration(5000);
      animator.start();

对对象操作改变属性;

    ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);//旋转
    animator.setDuration(5000);
    animator.start();

移除屏幕在进来:

  float curTranslationX = view.getTranslationX();
  ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX,     -500f, curTranslationX);
  animator.setDuration(5000);
  animator.start();

垂直方向上进行缩放再还原:

 ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);  
  • alpha、rotation、translationX和scaleY,分别可以完成淡入淡出、旋转、水平移动、垂直缩放这几种动画。
  • ObjectAnimator 不单对view操作,是任意对象,第二个参数的属性,会调用它的getter,setter:
    public void setAlpha(float value);
    public float getAlpha();

组合动画 AnimatorSet

after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行

  ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
  ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
  ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
  AnimatorSet animSet = new AnimatorSet();
  animSet.play(rotate).with(fadeInOut).after(moveIn);
  animSet.setDuration(5000);
  animSet.start();

监听器:

    anim.addListener(new AnimatorListenerAdapter() {
    @Override
      public void onAnimationEnd(Animator animation) {
        }
    });

默认的监听器要实现所有接口,使用AnimatorListenerAdapter可以只是实现部分接口。

XML方式

res目录下面新建一个animator文件夹

对应代码中的ValueAnimator
对应代码中的ObjectAnimator
对应代码中的AnimatorSet

      

android:propertyName:改变的属性的名字
android:valueType:值得类型,还有floatType

  • 加载方式
    Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim);

ValueAnimator的高级用法

TypeEvaluator:一个接口,提供一个过渡的计算接口,ofFloat()系统内置了一个FloatEvaluator

      public class FloatEvaluator implements TypeEvaluator {
        public Object evaluate(float fraction, Object startValue, Object endValue) {
        float startFloat = ((Number) startValue).floatValue();
          return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
        }
      }

ofObject:

    public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values)

我们就要自定义过渡计算,实现TypeEvaluator 接口。
比如:Point 原点

public class PointEvaluator implements TypeEvaluator{

@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
    Point startPoint = (Point) startValue;
    Point endPoint = (Point) endValue;
    float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
    float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
    Point point = new Point(x, y);
    return point;
    }
}

fraction:动画的完成度。
调用: ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);

ObjectAnimator的高级用法

ObjectAnimator内部的工作机制是通过寻找特定属性的get和set方法,然后通过方法不断地对值进行改变,从而实现动画效果的。
对颜色等有,具有getter,setter属性的改变过渡。

Interpolator:插值器

anim.setInterpolator(new BounceInterpolator()); 模拟物理规律。小球挂反弹效果。

  • 自定义Interpolator要实现TimeInterpolator 接口。
    public interface TimeInterpolator {
    float getInterpolation(float input);
    }
    这个接口有一个input值,跟上边的完成度有很大关系,input经过计算,改变完成度。系统默认的是匀速,所以默认情况下2者的值相同。

属性动画用在View上ViewPropertyAnimator

因为属性动画不是针对的view,而是object,但是它对view提供了很简便的用法:

  • view.animate().alpha(0.5f); //builder模式,链式。

  • view.animate().x(300).y(300).setDuration(200); //组合动画
    view的animate()方法返回一个ViewPropertyAnimator实例,进行链式调用完成后直接执行动画(隐式调用执行)。

你可能感兴趣的:(ddu- 属性动画)