属性动画Animator玩法/自定义估值器TypeEvaluator实现抛物线曲线动画

属性动画从Android3.0开始推出来的,与补间动画的不同,属性动画是真实改变了控件的属性。下面是多种属性动画并行和自定义估值器EvaluatorType实现的抛物线动画,高中物理公式s=1/2*g*t*t;

这里写图片描述

1.首先看前面三个radiation的点击动画,里面有alpha和scale动画,这里列举了三种方式实现动画并发

 group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                final RadioButton btn = (RadioButton) group.findViewById(checkedId);
                //第一种方式
              /* ObjectAnimator animator = new ObjectAnimator();
                animator.setFloatValues(1.0f, 0.5f, 1.0f);
                animator.setPropertyName("alpha");
                animator.setDuration(500);
                animator.setTarget(btn);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                       float value= (float) animation.getAnimatedValue();
                        btn.setScaleX(value);
                        btn.setScaleY(value);
                    }
                });
                animator.start();*/

第二种实现方式:

   /* PropertyValuesHolder holder1=PropertyValuesHolder.ofFloat("alpha",1.0f,0.5f,1.0f);
                PropertyValuesHolder holder2=PropertyValuesHolder.ofFloat("scaleX",1.0f,0.5f,1.0f);
                PropertyValuesHolder holder3=PropertyValuesHolder.ofFloat("scaleY",1.0f,0.5f,1.0f);
                ObjectAnimator objectAnimator=ObjectAnimator.ofPropertyValuesHolder(btn,holder1,holder2,holder3);
                objectAnimator.setDuration(500);
                objectAnimator.start();*/

第三种实现方式:

  ObjectAnimator  objectAnimator1=new ObjectAnimator().ofFloat(btn,"alpha",1.0f,0.5f,1.0f);
                ObjectAnimator  objectAnimator2=new ObjectAnimator().ofFloat(btn,"scaleX",1.0f,0.5f,1.0f);
                ObjectAnimator  objectAnimator3=new ObjectAnimator().ofFloat(btn,"scaleY",1.0f,0.5f,1.0f);
                AnimatorSet set=new AnimatorSet();
                set.setDuration(500);
                set.playTogether(objectAnimator1,objectAnimator2,objectAnimator3);
                set.start();

注意:属性动画可以做颜色过渡动画,源码扣初来的片段如下

public static ValueAnimator ofArgb(int... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setIntValues(values);
        anim.setEvaluator(ArgbEvaluator.getInstance());
        return anim;
    }

下面是抛物线动画实现,主要是估值器的使用,重写估值计算规则

 //自定义估值器,重写计算规则
    class MyEvaluator implements TypeEvaluator<PointF> {

        public MyEvaluator() {
        }

        /**
         * @param fraction   动画执行了的百分比,
         * @param startValue 点的起始值
         * @param endValue   点的最终值
         * @return
         */
        @Override
        public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
            //抛物线方程式 s=1/2*g*t*t
            //定义初速度150,加速g=9.8,时间t=5s,就是动画设置的执行时间
            float t = 5 * fraction*1.0f;
            PointF pointF = new PointF();
            pointF.x = 150 * t;
            pointF.y = 0.5f * 98.0f * t * t;
            return pointF;
        }
    }

前面上述三种动画并发的第一种方式,设置vaules可以设置point,并且再updatelistener中不断的改变view的位置,代码如下:

 image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ValueAnimator animator = new ValueAnimator();
                MyEvaluator evaluator = new MyEvaluator();
                animator.setDuration(5000);
                //第一.先设置value
                animator.setObjectValues(new PointF(0,0));
                //第二.再设置估值器
                animator.setEvaluator(evaluator);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        PointF pointF = (PointF) animation.getAnimatedValue();
                        //通过不断的改变view的坐标来实现抛物线动画
                        image.setX(pointF.x);
                        image.setY(pointF.y);
                    }
                });
                animator.start();
            }

注意:1.@param fraction 动画执行了的百分比,这个百分比是匀速返回的。
2. animator.setObjectValues();和animator.setEvaluator()的先后顺序不能反,先设置值,再设置估值器,否则会不具体报空指针异常。
3. 总结:以后可以利用估值器实现更多的曲线动画,比如贝塞尔、正弦余弦动画等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值