美文网首页
PropertyAnimation

PropertyAnimation

作者: kjy_112233 | 来源:发表于2017-09-14 15:26 被阅读0次

    一、ValueAnimator

    ValueAnimator是整个属性动画机制当中最核心的一个类。属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。

    (1)ValueAnimator的构造方法

    • static ValueAnimator ofInt(int... values)
      以整型数值的形式从初始值过渡到结束值,内置IntEvaluator估值器。
    • static ValueAnimator ofFloat(float... values)
      以浮点型数值的形式从初始值 过渡到结束值,内置FloatEvaluator估值器
    • static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values)
      以对象的形式从初始值过渡到结束值,需要自定义估值器

    (2)ValueAnimator的使用方式

    ValueAnimator animator = ValueAnimator.ofInt(0,3);
    animator.setDuration(5000);//播放时长
    animator.setStartDelay(300);//延迟播放
    animator.setRepeatCount(0);//重放次数
    animator.setRepeatMode(ValueAnimator.RESTART);//重放模式
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            //获取改变后的值
            int currentValue = (int) animation.getAnimatedValue();
            //改变后的值发赋值给对象的属性值
            view.setproperty(currentValue);
            //刷新视图
            view.requestLayout();
        }
    });
    //启动动画
    animator.start();
    
    • 在路径res/animator路径下新建XML文件设置动画参数。
    • 代码中启动动画
    <?xml version="1.0" encoding="utf-8"?>
    <animator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="4000"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:repeatCount="infinite"
        android:repeatMode="reverse"
        android:startOffset="1000"
        android:valueFrom="0"
        android:valueTo="100"
        android:valueType="intType" />
    
    • duration:设置动画时间
    • interpolator:设置插值器
    • repeatCount:设置播放次数
    • repeatMode:设置重复播放类型
    • valueFrom:设置开始参数
    • valueTo:设置结束参数
    • valueType:设置参数值类型
    Animator animator = AnimatorInflater.loadAnimator(context, R.animator.animation);  
    animator.setTarget(view);  
    animator.start();  
    

    (3)自定义TypeEvaluator估值器

    //通过查看IntEvaluator估值器源码得知,通过数学公式,返回当前动画的值。
    public class MyEvaluator implements TypeEvaluator {
        @Override
        public Object evaluate(float fraction, Object startValue, Object endValue) {
            //通过startValue和endValue计算出新的Object对象并返回
            return null;
        }
    }
    

    (4)Interpolator插值器
    系统插值器

    • AccelerateDecelerateInterpolator:先加速再减速
    • AccelerateInterpolator:持续加速
    • AnticipateInterpolator:先退后再加速前进
    • AnticipateOvershootInterpolator:先退后再加速前进,超出终点后再回终点
    • BounceInterpolator:结束时弹球效果
    • CycleInterpolator:周期运动
    • DecelerateInterpolator:减速
    • LinearInterpolator:匀速
    • OvershootInterpolator:向前弹出一定值之后回到原来位置

    二、自定义view动画效果

    public class MyAnimatorView extends View {
    
        private Paint paint;//画笔
        private Point point;//记录当前动画的x,y坐标
        public static final float RADIUS = 50f;
    
        public MyAnimatorView(Context context) {
            super(context);
        }
    
        public MyAnimatorView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyAnimatorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setColor(Color.RED);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            //第一次绘制时
            if (point == null) {
                //初始化坐标为(50f, 50f)
                point = new Point(RADIUS, RADIUS);
                drawCircle(canvas);
                startAnimation();
            } else {//非第一次绘制
                drawCircle(canvas);
            }
        }
    
        //画圆
        private void drawCircle(Canvas canvas) {
            float x = point.getX();
            float y = point.getY();
            canvas.drawCircle(x, y, RADIUS, paint);
        }
    
        //开始动画
        private void startAnimation() {
            //设置起始值
            Point startPoint = new Point(RADIUS, RADIUS);
            //设置结束值
            Point endPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS);
            final ValueAnimator anim = ValueAnimator.ofObject(new MyEvaluator(), startPoint, endPoint);
            //设置插值器
            anim.setInterpolator(new BounceInterpolator());
            //设置监听,每当Point的值有改变的时候,都会调用onAnimationUpdate()方法
            anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    //更新curPoint,即更新当前坐标
                    point = (Point) animation.getAnimatedValue();
                    // 刷新,重现调用onDraw()方法
                    invalidate();
                }
            });
            anim.setDuration(5000);
            anim.start();
        }
    }
    
    • 在布局文件中引入该view

    三、ObjectAnimator

    ObjectAnimator是ValueAnimator的子类,ValueAnimator只是对值进行平滑的动画过渡;ObjectAnimator直接对任意对象的任意属性进行动画操作,如View的alpha属性
    ValueAnimator需要我们为对象属性手动赋值;ObjectAnimator会为对象属性自动赋值。
    (1)ObjectAnimator的实现方式
    使用xml方式实现

    <?xml version="1.0" encoding="utf-8"?>
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="5000"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:propertyName="scaleX"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:startOffset="200"
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:valueType="floatType">
    </objectAnimator>
    
    • duration :表示动画执行的时间
    • propertyName:表示修改的对象的哪个属性值,这里是透明度
    • valueFrom:表示从哪个状态值开始动画
    • valueTo:表示到哪个状态值结束动画
    • valueType:类型估值,主要用于设置动画操作属性的值
    • repeatMode:表示重复的模式 reverse表示反向,restart为重新执行
    • repeatCount:动画重复的计数,动画将会执行该值+1次
    • startOffset:动画多次执行的间隔时间
    • interpolator:指定动画插入器
    Animator anim = AnimatorInflater.loadAnimator(this, R.animator.animator_o);
    anim.setTarget(tv_name);
    anim.start();
    

    使用代码动态实现

    ObjectAnimator alphaAnimation = ObjectAnimator.ofFloat(tv_name, "scaleX", 0f, 1f);
    alphaAnimation.setDuration(5000);
    alphaAnimation.setRepeatCount(0);
    alphaAnimation.setRepeatMode(ValueAnimator.REVERSE);
    alphaAnimation.setStartDelay(1000);
    alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
    alphaAnimation.start();
    

    四、AnimatorSet

    组合动画xml实现

    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <objectAnimator
            android:duration="1000"
            android:interpolator="@android:anim/accelerate_decelerate_interpolator"
            android:propertyName="scaleX"
            android:repeatCount="1"
            android:repeatMode="reverse"
            android:startOffset="200"
            android:valueFrom="1.0"
            android:valueTo="0.0"
            android:valueType="floatType" />
        <objectAnimator
            android:duration="1000"
            android:interpolator="@android:anim/accelerate_decelerate_interpolator"
            android:propertyName="scaleY"
            android:repeatCount="1"
            android:repeatMode="reverse"
            android:startOffset="200"
            android:valueFrom="1.0"
            android:valueTo="0.0"
            android:valueType="floatType" />
    </set>
    

    代码实现

    AnimatorSet animatorSet = new AnimatorSet();
    ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(tv_name, "scaleX", 1f, 0f);
    scaleXAnimator.setDuration(1000);
    scaleXAnimator.setRepeatCount(1);
    scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);
    scaleXAnimator.start();
    ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(tv_name, "scaleY", 1f, 0f);
    scaleYAnimator.setDuration(1000);
    scaleYAnimator.setRepeatCount(1);
    scaleYAnimator.setRepeatMode(ValueAnimator.REVERSE);
    animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
    animatorSet.start();
    

    五、Animator监听器

    ObjectAnimator、ValueAnimator,AnimatorSet都是继承自Animator类的。因此addListener()这个方法算是一个通用的方法。

    animator.addListener(new Animator.AnimatorListener() {
        //动画开始时执行
        @Override
        public void onAnimationStart(Animator animation) {
        }
        //动画结束时执行
        @Override
        public void onAnimationEnd(Animator animation) {
        }
        //动画取消时执行
        @Override
        public void onAnimationCancel(Animator animation) {
        }
        //动画重复时执行
        @Override
        public void onAnimationRepeat(Animator animation) {
        }
    });
    

    相关文章

      网友评论

          本文标题:PropertyAnimation

          本文链接:https://www.haomeiwen.com/subject/iklkjxtx.html