Android Developer

Android UI——Material Design——属性动

2019-03-22  本文已影响1人  So_ProbuING

属性动画

什么是属性动画

属性动画是从3.0及以后出现的,可以不断的控制控件的属性变化达到动画的效果,一般我们是一些组合的属性动画达到复杂效果。
在以前的动画都是使用:补间动画BetweenAnimation、帧动画FrameAnimation
与之前的View动画相比,属性动画更加丰富、好用;属性动画是真实地改变控件的属性,而不像view动画是一个假象,控件的属性并没有发生变化。而属性动画是真实的改变控件的属性

属性动画可以操作的控件的属性

属性动画的创建与使用

ObjectAnimator 对象动画 指定动画执行方式 最后一个可变参数代表动画执行的值

  ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "translationX", 0f, 100f, 200f, 300f);
        objectAnimator.setDuration(500);
        objectAnimator.start();

多个属性动画一起执行方法

//2.----------------多个动画同时执行---办法1:设置动画监听,开始第一个动画同时开启其他动画-----------------
        //方法1:
        ObjectAnimator animator = ObjectAnimator.ofFloat(v, "haha", 0f, 100f);//没有这个属性的时候,就是valueanimator
        animator.setDuration(300);
        //设置动画监听
        animator.addUpdateListener(new AnimatorUpdateListener() {
            
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //动画在执行的过程当中,不断地调用此方法
                animation.getAnimatedFraction()//百分比
                //得到duration时间内 values当中的某一个中间值。0f~100f
                float value = (float) animation.getAnimatedValue();//
                iv.setScaleX(0.5f+value/200);//0.5~1
                iv.setScaleY(0.5f+value/200);//0.5~1
            }
        });
        animator.start();
        
        animator.addListener(new AnimatorListener() {
            
            @Override
            public void onAnimationStart(Animator animation) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void onAnimationRepeat(Animator animation) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void onAnimationEnd(Animator animation) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void onAnimationCancel(Animator animation) {
                // TODO Auto-generated method stub
                
            }
        });
        
        //2)方法2:用ValueAnimator
        ValueAnimator animator = ValueAnimator.ofFloat(0f,200f);
        animator.setDuration(200);
        animator.addUpdateListener(new AnimatorUpdateListener() {
            
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //动画在执行的过程当中,不断地调用此方法
            animation.getAnimatedFraction()//百分比
            //得到duration时间内 values当中的某一个中间值。0f~100f
                float value = (float) animation.getAnimatedValue();//
                iv.setScaleX(0.5f+value/200);//0.5~1
                iv.setScaleY(0.5f+value/200);//0.5~1
        }
        });
        animator.start();
        //3)方法3
        //float... values:代表关键帧的值
        PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("alpha", 1f,0.7f,1f);
    PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 1f,0.7f,1f);
        PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("scaleY", 1f,0.7f,1f);
        PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("translationX", 0f,300f);
        
        ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(iv, holder1,holder2,holder3);
        animator.setDuration(1000);
        animator.addUpdateListener(new AnimatorUpdateListener() {
            
        @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // TODO Auto-generated method stub
                float animatedValue = (float) animation.getAnimatedValue();
                float animatedFraction = animation.getAnimatedFraction();
            long playTime = animation.getCurrentPlayTime();
                
            System.out.println("animatedValue:"+animatedValue+",  playTime:"+playTime);
        }
    });
        animator.start();
        //4)方法4:-----------------动画集合--------------------
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(iv,"alpha", 1f,0.7f,1f);
        ObjectAnimator animator2 = ObjectAnimator.ofFloat(iv,"scaleX", 1f,0.7f,1f);
        ObjectAnimator animator3 = ObjectAnimator.ofFloat(iv,"scaleY", 1f,0.7f,1f);
        
    AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(500);
        animatorSet.play(anim);//执行当个动画
        animatorSet.playTogether(animator1,animator2,animator3);//同时执行
        animatorSet.playSequentially(animator1,animator2,animator3);//依次执行动画
        animatorSet.start();

依托TypeEvaluator 实现抛物线效果

        /**
         * x:匀速
         * y:加速度   y=1/2*g*t*t
         * 使用估值器最好实现。
         */
        ValueAnimator valueAnimator = new ValueAnimator();
        valueAnimator.setDuration(4000);
        valueAnimator.setFloatValues(values)
        valueAnimator.setObjectValues(new PointF(0, 0));
        //估值器---定义计算规则
        valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {

            @Override
            public PointF evaluate(float fraction, PointF startValue,
                    PointF endValue) {
                //拿到每一个时间点的坐标
                //x=v*t (s秒)
                PointF pointF = new PointF();
                pointF.x = 100f*(fraction*4);//初始速度*(执行的百分比*4)
                pointF.y = 0.5f*9.8f*(fraction*4)*(fraction*4);
                pointF.y = 0.5f*150f*(fraction*4)*(fraction*4);
                return pointF;
            }
        });
        
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
            
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //得到此时间点的坐标
                PointF pointF = (PointF) animation.getAnimatedValue();
                
                iv.setX(pointF.x);
                iv.setY(pointF.y);
            }
        });
        valueAnimator.start();
        
        
        ObjectAnimator oa = ObjectAnimator.ofFloat(v, "translationY", 0f,1100f);
        oa.setDuration(500);
        //设置加速器---
        oa.setInterpolator(new AccelerateInterpolator(5));
        oa.setInterpolator(new AccelerateDecelerateInterpolator());
        oa.setInterpolator(new AnticipateInterpolator(8));
        oa.setInterpolator(new OvershootInterpolator());
        oa.setInterpolator(new CycleInterpolator(4));
        oa.setInterpolator(new BounceInterpolator());
        
        oa.start();
    }
上一篇下一篇

猜你喜欢

热点阅读