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

来源:互联网 发布:测试虚拟机上的nginx 编辑:程序博客网 时间:2024/05/21 19:36

属性动画从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. 总结:以后可以利用估值器实现更多的曲线动画,比如贝塞尔、正弦余弦动画等。

原创粉丝点击