Android-属性动画Property Animation-ObjectAnimator

Android-Property Animation-ObjectAnimator


    Property Animation(属性动画)是Android 3.0引进的(introduced in Android 3.0),API Level 11,可以让对象的任何属性进行动画变换。可以根据时间的推移来改变任何对象的属性来定义一个动画,而不用关心该对象是否要绘制在屏幕上。

    属性动画系统可以定义以下动画特性:


1. Duration持续时间):指定动画的持续时间。默认长度是300毫秒。

2.Animator sets (动画集合):把动画组织到一个逻辑集合中,然后或者同时、或者顺序的、或者延迟播放它们。

3. Repeat count and behavior重复次数和行为):指定在动画结束时是否重新播放动画,以及重复播放的次数。还可以指定动画是否能够反向回播,如果设置了反向回播,那么动画就会先向前再向后,重复播放,直到达到播放的次数。

4. Time interpolation时间插值):能够做为计算当前动画运行时间的函数的属性值来指定,它决定动画的变化频率。

5.Frame refresh delay 帧刷新延迟):指定动画帧的刷新频率。默认是每10秒中刷新一次,但是应用程序最终的刷新帧的速度依赖与系统的繁忙程度以及系统能够提供的底层定时器的反应速度。





1.ObjectAnimator实现简单的动画

    ObjectAnimator是ValueAnimator的子类,在构造函数中传入了目标对象和对应属性值的名字(要求对象类有相应的get/set方法),会自动进行属性值的设置。

    首先需要实例化一个ObjectAnimator对象,ObjectAnimator提供了ofInt、ofFloat、ofObject,这几个方法都是设置动画作用的元素、作用的属性、动画开始、结束、以及中间的任意个属性值。指定该方法的参数:动画的对象(如下为imageView)、对象的动画属性(如"rotationX"、"translationY"等)。

 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView,"rotationX",0F,360F);


    设置动画持续时间和调用start()方法。

objectAnimator.setDuration(3000);
objectAnimator.start();
以上就可以实现一个简单的动画。




2.Animator sets 动画集合


        当有多个动画的时候,可以使用动画集合Animator sets把动画组织到一个逻辑集合中,然后或者同时、或者顺序的、或者延迟播放它们(调用相应的方法实现所要的功能,如playTogether多个动画同时执行、playSequentially多个动画依次执行)。
)。

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(objectAnimator1,objectAnimator2,objectAnimator3); //playTogether多个动画同时执行,playSequentially多个动画依次执行
animatorSet.setDuration(3000);
animatorSet.start();
也可以这样:animatorSet.play (objectAnimator1). with(objectAnimator2);

animatorSet.play(objectAnimator2).with(objectAnimator3);

animatorSet.play(objectAnimator3).after(objectAnimator2);等。


3.给动画添加结束监听事件


    我们可以添加某个动画的监听,监听动画的开始、结束、被取消、重复等事件

objectAnimator3.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {

            }

            @Override
            public void onAnimationEnd(Animator animator) {
                Toast.makeText(MainActivity.this,"animation end",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAnimationCancel(Animator animator) {

            }

            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });

    如果我们仅需要知道动画的结束,那么就不必重写以上的开始、结束、被取消等每个方法,这时可以使用AnimatorListenerAdapter。This adapter class provides empty implementations of the methods from Animator.AnimatorListener. Any custom listener that cares only about a subset of the methods of this listener can simply subclass this adapter class instead of implementing the interface directly.

objectAnimator3.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                Toast.makeText(MainActivity.this,"end Animation",Toast.LENGTH_SHORT).show();
            }
        });


4.运用以上知识点实现动画

public class MainActivity extends Activity implements View.OnClickListener{
    ImageView imageView;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.image1);
        button = (Button) findViewById(R.id.bt_move);
        button.setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.bt_move :
                StartAnimation();
                break;
        }
    }
    public void StartAnimation(){
        ObjectAnimator objectAnimator00 = ObjectAnimator.ofFloat(imageView,"rotationX",0F,360F);
        ObjectAnimator objectAnimator0 = ObjectAnimator.ofFloat(imageView,"translationY",0F,150F);
        ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView,"alpha",0F,1F);
        ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(imageView,"scaleX",0F,1F);
        ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(imageView,"scaleY",0F,1F);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(objectAnimator1,objectAnimator2,objectAnimator3); //playTogether多个动画同时执行,playSequentially多个动画依次执行
        animatorSet.play(objectAnimator00).after(objectAnimator0);       
        animatorSet.setDuration(3000);
        animatorSet.start();
//        objectAnimator1.setDuration(5000);
//        objectAnimator1.start();
        objectAnimator3.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                Toast.makeText(MainActivity.this,"animation end",Toast.LENGTH_SHORT).show();
            }
        });
//        objectAnimator3.addListener(new Animator.AnimatorListener() {
//            @Override
//            public void onAnimationStart(Animator animator) {
//
//            }
//
//            @Override
//            public void onAnimationEnd(Animator animator) {
//                Toast.makeText(MainActivity.this,"animation end",Toast.LENGTH_SHORT).show();
//            }
//
//            @Override
//            public void onAnimationCancel(Animator animator) {
//
//            }
//
//            @Override
//            public void onAnimationRepeat(Animator animator) {
//
//            }
//        });
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值