属性动画基础笔记

修改自定义属性

  • 创建自定义View,如下:
public class CicleView extends View {
   private Paint paint;
   private float radius;

   public CicleView(Context context) {
       super(context);
       init(context, null);
   }

   public CicleView(Context context, @Nullable AttributeSet attrs) {
       super(context, attrs);
       init(context, attrs);
   }

   public CicleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
       super(context, attrs, defStyleAttr);
       init(context, attrs);
   }

   public void setRadius(float radius) {
       this.radius = radius;
       invalidate();
   }

   private void init(Context context, AttributeSet attrs) {
       paint = new Paint();
       paint.setColor(Color.BLUE);
       paint.setAntiAlias(true);
       paint.setMaskFilter(new BlurMaskFilter(2f, BlurMaskFilter.Blur.NORMAL));
   }


   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
       int cx = getWidth() / 2;
       int cy = getHeight() / 2;
       canvas.drawCircle(cx, cy, radius, paint);
   }
}
  • 使用Animator 改变属性
 //使用ObjectAnimator
       ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "radius", 0, 120, 240, 360);
       objectAnimator.setDuration(2000);
       objectAnimator.setRepeatCount(100);
       objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
       objectAnimator.start();
       //使用ValueAnimator
       ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 120, 240, 360);
       valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
           @Override
           public void onAnimationUpdate(ValueAnimator animation) {
               float value = (float) animation.getAnimatedValue();
               iv.setRadius(value);
           }
       });
       valueAnimator.start();

插值器-TimeInterpolator

  • 在动画的播放过程中Android中提供插值器来改变动画的播放速率,采用不用的插值器来实现不同的播放效果,所有的插值器都要去实现TimeInterpolator接口。

Android中默认实现的10种插值器

  • AccelerateDecelerateInterpolator
    • 效果: 改变的速度越来越慢,
    • getInterpolation(float input)方法返回值是 (Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;cos曲线
  • AccelerateInterpolator
    • 效果:改变的速度越来越快
    • getInterpolation(float input) 返回值是 :input的2N次方
  • AnticipateInterpolator
    • 效果:改变速度开始快,然后再变慢
    • getInterpolation(float t) 返回值是:(k+1)*t3-k*t2
  • AnticipateOvershootInterpolator
    • 效果:改变速度开始快,然后再变慢,最后有个回弹效果,回弹一次。
    • getInterpolation(float t) 返回值:
      a(t, s) = t * t * ((s + 1) * t - s);
      o(t, s) = t * t * ((s + 1) * t + s);
      f(t) = 0.5 * a(t * 2, tension * extraTension), when t < 0.5;
      f(t) = 0.5 * (o(t * 2 - 2, tension * extraTension) + 2), when t <= 1.0;
  • BounceInterpolator
    • 效果: 改变速度越来越快,最后有回弹振动效果。
    • getInterpolation(float t) 返回值:_b(t) = t * t * 8;
      bs(t) = _b(t) for t < 0.3535;
      bs(t) = _b(t - 0.54719) + 0.7 for t < 0.7408;
      bs(t) = _b(t - 0.8526) + 0.9 for t < 0.9644;
      bs(t) = _b(t - 1.0435) + 0.95 for t <= 1.0;
      b(t) = bs(t * 1.1226);
  • CycleInterpolator(float cycles)
    • 效果:循环指定次数(cycles),改变速率是sin函数
    • getInterpolation(float input) 返回值:(Math.sin(2 * mCycles * Math.PI * input));
  • DecelerateInterpolator
    • 效果:改变速度越来越慢
    • getInterpolation(float input) 返回值是input的1-(1-input)^2n
  • LinearInterpolator
    • 效果:匀速改变
    • getInterpolation(float input)返回值:就是input
      -LinearOutSlowInInterpolator
    • 效果:一开始匀速,后来越来越慢
  • OvershootInterpolator
    • 效果:一开始匀速,然后会回弹一次。
    • getInterpolation(float input)返回值:
      _o(t) = t * t * ((tension + 1) * t + tension);
      o(t) = _o(t - 1) + 1;

自定义TimeInterpolator

  • 继承 BaseInterpolator 类
  • 重写 float getInterpolation(float input)方法。根据一定的条件返回不同的值。
public class CustomInterpolator extends BaseInterpolator {
   @Override
   public float getInterpolation(float input) {
       return 0;
   }
}

估值器-TypeEvaluator

  • 用来确定在动画过程中每时每刻动画的具体值得换句话说就是确定ValueAnimator.getAnimatedValue()返回的具体对象类型。

Android中默认实现的估值器

  • ArgbEvaluator
  • FloatArrayEvaluator
  • FloatEvaluator
  • IntArrayEvaluator
  • IntEvaluator
  • PointFEvaluator
  • RectEvaluator

自定义Evaluator

  • 实现 TypeEvaluator 接口
  • 重写 T evaluate(float fraction, T startValue, T endValue)方法。根据一定的条件返回不同的值。
 class CustomEvaluator implements TypeEvaluator<Number> {

        @Override
        public Number evaluate(float fraction, Number startValue, Number endValue) {
            return null;
        }
    }

重新实现上面的例子

  • 创建圆点实体类
/**
 * 圆形的实体类
 */
public class Cicle {
    //圆点x坐标
    private float xCenter;
    //圆点y坐标
    private float yCenter;
    //半径
    private float radius;

    public Cicle() {
    }

    public Cicle(float xCenter, float yCenter, float radius) {
        this.xCenter = xCenter;
        this.yCenter = yCenter;
        this.radius = radius;
    }

    public float getxCenter() {
        return xCenter;
    }

    public void setxCenter(float xCenter) {
        this.xCenter = xCenter;
    }

    public float getyCenter() {
        return yCenter;
    }

    public void setyCenter(float yCenter) {
        this.yCenter = yCenter;
    }

    public float getRadius() {
        return radius;
    }

    public void setRadius(float radius) {
        this.radius = radius;
    }
}
  • 自定义View 绘制圆形
public class CicleView extends View {
    private Paint paint;
    private Cicle cicle;

    public CicleView(Context context) {
        super(context);
        init();
    }

    public CicleView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CicleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public void setCicle(Cicle cicle) {
        this.cicle = cicle;
        invalidate();
    }

    private void init() {
        paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setAntiAlias(true);
        paint.setMaskFilter(new BlurMaskFilter(2f, BlurMaskFilter.Blur.NORMAL));
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        cicle.setxCenter(width / 2);
        cicle.setyCenter(height / 2);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(cicle.getxCenter(), cicle.getyCenter(), cicle.getRadius(), paint);
    }
}
  • 自定义估值器
 class CustomEvaluator implements TypeEvaluator<Cicle> {

        @Override
        public Cicle evaluate(float fraction, Cicle startValue, Cicle endValue) {
            Log.d(TAG, "evaluate: f:" + fraction + ";;startR:" + startValue.getRadius() + ";;" +
                    endValue.getRadius());
            Cicle cicle = new Cicle();
            cicle.setxCenter((width) / 2);
            cicle.setyCenter((height) / 2);
            cicle.setRadius((endValue.getRadius() - startValue.getRadius()) * fraction);
            return cicle;
        }
    }
  • 实现动画
        width = getWindowManager().getDefaultDisplay().getWidth();
        height = getWindowManager().getDefaultDisplay().getHeight();
        Cicle cicle1 = new Cicle();
        cicle1.setRadius(0);
        Cicle cicle2 = new Cicle();
        cicle2.setRadius(500);
        ValueAnimator valueAnimator = ValueAnimator.ofObject(new CustomEvaluator(), cicle1, cicle2);
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.setDuration(5000);
        valueAnimator.setEvaluator(new CustomEvaluator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Cicle cicle = (Cicle) animation.getAnimatedValue();
                iv.setCicle(cicle);
            }
        });
        valueAnimator.start();

猜你喜欢

转载自blog.csdn.net/genmenu/article/details/88659777