Android笔记之属性动画

来源:互联网 发布:java jre1.6 32位下载 编辑:程序博客网 时间:2024/06/10 09:10

Anroid属性动画与传统动画相比,可以说是强大的改进。属性动画顾名思义,就是改变图片属性,例如为一张图片设置点击事件,并加上平移动画,如果是用传统动画,点击平移后的动画,不会产生点击效果,而点击动画原位置,却会产生点击效果!因为图片固有属性没变,你所加的动画只不过是表面“障眼法”,其实图片仍在原位置,这时如果想实现图片点击事件,就会比较麻烦,可以把图片设置在动画后的位置隐藏,设置传统动画后图片显示,这样点击事件就会产生。
有点跑题了,继续说属性动画,如果用属性动画设置点击事件,不管图片移动到哪里,动画点击效果仍然存在,因为图片固有属性改变了。
Animator-属性动画:
1、ObjectAnimator:
别忘了ImageView imageView = (ImageView) findViewById(R.id.imageView);
下面这段代码比较适合单个动画效果设置,下面动画叠加比较占用系统资源。

 PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("rotation", 0,        360F);         PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("alpha", 1.0F,         0.5F);         PropertyValuesHolder p3 =        PropertyValuesHolder.ofFloat("translationY",         0, 200F);         ObjectAnimator.ofPropertyValuesHolder(imageView, p1, p2, p3)    .setDuration(1000).start();

这段代码比较适合动画效果叠加设置

// 这个方法较好        ObjectAnimator o1 = ObjectAnimator.ofFloat(imageView, "rotation", 0F,                360F);        ObjectAnimator o2 = ObjectAnimator.ofFloat(imageView, "translationY",                0F, 200F);        ObjectAnimator o3 = ObjectAnimator.ofFloat(imageView, "translationX",                0F, 200F);        AnimatorSet set = new AnimatorSet();        set.playTogether(o1, o2, o3);        set.setDuration(1000);        set.start();

动画顺序播放

ImageView imageView = (ImageView) findViewById(R.id.imageView);        ObjectAnimator o1 = ObjectAnimator.ofFloat(imageView, "rotation", 0F,                360F);        ObjectAnimator o2 = ObjectAnimator.ofFloat(imageView, "translationX",                0F, 200F);        ObjectAnimator o3 = ObjectAnimator.ofFloat(imageView, "translationY",                0F, 200F);        AnimatorSet set = new AnimatorSet();        set.playSequentially(o3, o2, o1);        set.setDuration(1000);        set.start();

上面的顺序播放还有另一种方法像这样
set.play(o1).with(o3);
set.play(o1).after(o2);
这种方法可以设置动画叠加顺序等等等,
这些动画实现代码与传统动画比较类似就不多说了

动画监听事件–注释掉的部分是可以监听的所有:开始、结束、重复什么的。。。

animator.addListener(new AnimatorListenerAdapter() {            @Override            public void onAnimationEnd(Animator animation) {                // TODO Auto-generated method stub                super.onAnimationEnd(animation);                Toast.makeText(AnimatorDemo.this, "动画结束", Toast.LENGTH_SHORT)                        .show();            }        });        // animator.addListener(new AnimatorListener() {        //        // @Override        // public void onAnimationStart(Animator animation) {        //        // }        //        // @Override        // public void onAnimationRepeat(Animator animation) {        // // TODO Auto-generated method stub        //        // }        //        // @Override        // public void onAnimationEnd(Animator animation) {        // Toast.makeText(Animotator.this, "动画结束", Toast.LENGTH_SHORT)        // .show();        //        // }        //        // @Override        // public void onAnimationCancel(Animator animation) {        // // TODO Auto-generated method stub        //        // }        // });        animator.start();

2、ValueAnimator
看看ObjectAnimator源代码你会发现其实ObjectAnimator主要是ValueAnimator实现的,也就是说通过ValueAnimator可以实现超过ObjectAnimator动画更多的效果。认真研究ObjectAnimator源代码,你可以通过ValueAnimator实现更为丰富意想不到的效果,这就看你的功底、想象力和审美了!

下面这段代码可以实现一个简单的Button计时器效果,点击后在5秒内,从0计时到100.这只是最最简单的小例子,ValueAnimator有多强大用了就知道。

 final Button button = (View) findViewById(R.id.button2);         // ValueAnimator         ValueAnimator animator = ValueAnimator.ofInt(0, 100);        animator.setDuration(5000);         animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()         {         @Override         public void onAnimationUpdate(ValueAnimator animation) {         integer value = (integer) animation.getAnimatedValue();         button.setText("" + value);         }         });        animator.start();
1 0
原创粉丝点击