您的位置:首页 > 移动开发 > Android开发

Android笔记之属性动画

2016-02-22 20:40 381 查看
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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: