【安卓学习笔记】安卓动画的实现(2)——属性动画(Property)

【安卓学习笔记】安卓动画的实现(2)——属性动画(Property)_第1张图片
截取自菜鸟教程

1. 使用方法

ObjectAnimator.ofFloat(image, "translationX", 0,100).setDuration(2000).start();

第一个参数是组件,第二个参数是动画操作方式,有以下几种:

  • 平移 translationX,translationY,X,Y
  • 旋转 rotation,rotationX,rotationY
  • 透明度 alpha
  • 缩放 scaleX,scaleY

也可这样写

ObjectAnimator animation = ObjectAnimator.ofFloat(image, "rotationY", 0,360).setDuration(500);
animation.setRepeatCount(4);
animation.start();

2. 多个属性动画组合(3种方式)

(1) 多次写动画操作,如下
ObjectAnimator.ofFloat(image, "translationX", 0,100).setDuration(2000).start();
ObjectAnimator.ofFloat(image, "translationY", 0,100).setDuration(2000).start();
(2) 使用PropertyValuesHolder
PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("translationX", 0,100);
PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 0,1);
PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("scaleY", 0,1);
ObjectAnimator.ofPropertyValuesHolder(image, holder1,holder2,holder3).setDuration(2000).start();
(3) 使用AnimatorSet(补间动画里面也有set这种方式)
ObjectAnimator animator1 = ObjectAnimator.ofFloat(image, "translationX", 0,100);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(image, "alpha", 0,1);     
AnimatorSet animatorSet = new AnimatorSet();
/********按顺序播放*****/
//animatorSet.playSequentially(animator1,animator2);
/********同时播放*****/
//animatorSet.play(animator1).with(animator2);
/********按顺序播放*****/
animatorSet.play(animator2).after(animator1);
        
animatorSet.setDuration(2000);
animatorSet.start();

3. 属性动画监听

ObjectAnimator animator = ObjectAnimator.ofFloat(image, "translationX", 0,100);
animator.setDuration(2000);
animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                // TODO Auto-generated method stub
                super.onAnimationEnd(animation);
                Toast.makeText(MainActivity3.this, "动画完毕", Toast.LENGTH_SHORT).show();
            }
});
animator.start();

addListener函数中传入的也可为,这种方式里面重写的方法太多。

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
                
            }
});

4. 属性动画的ValueAnimator

ValueAnimator是属性动画的数值发生器,它是ObjectAnimator的父类。从名字可以看出来,它的功能主要是为动画生成动画参数,不参与显示动画。一个例子可以看出来。

ValueAnimator animator = ValueAnimator.ofInt(0,100);
animator.setDuration(5000);
animator.addUpdateListener(new AnimatorUpdateListener() {
            
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // TODO Auto-generated method stub
                Integer num = (Integer) animation.getAnimatedValue();
                btn.setText(""+num);
            }
});
animator.start();

在onAnimationUpdate方法中,可以得到实时变化的数值。这里让button上的文字在5秒内从0变化到100。
可以利用ValueAnimator设置自定义的动画参数。 如下使用的是ofObject方法。

ValueAnimator animator = ValueAnimator.ofObject(new TypeEvaluator() {

            @Override
            public PointF evaluate(float fraction, PointF startValue,
                    PointF endValue) {
                
                float x=(endValue.x-startValue.x)*fraction;
                float y=(endValue.y-startValue.x)*fraction;
                btn.setX(x);
                btn.setY(y);
                return null;
            }
        }, new PointF(1, 1),new PointF(300,300));
animator.setDuration(5000);
animator.start();

你可能感兴趣的:(【安卓学习笔记】安卓动画的实现(2)——属性动画(Property))