视图动画比较简单,它提供了AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation四种动画方式。
视图动画一个非常大的缺陷就是不具有交互性,当一个View发生视图动画后,其相应事件的位置依然在显示动画前的位置。但是优点也非常明显,即效率比较高且使用方便。
AlphaAnimation aa = new AlphaAnimation(0f, 1f);
aa.setDuration(1000);
view.startAnimation(aa);
RotateAnimation ra = new RotateAnimation(0f, 359f//旋转的角度,负值代表逆时针的
, Animation.RELATIVE_TO_SELF, 0.5f//自己的X中心
, Animation.RELATIVE_TO_SELF, 0.5f);//自己的Y中心
ra.setDuration(1000);
view.startAnimation(ra);
ScaleAnimation sa = new ScaleAnimation(0f, 2f, 0f, 2f//0倍到2倍
, Animation.RELATIVE_TO_SELF, 0.5f//中心缩放
, Animation.RELATIVE_TO_SELF, 0.5f);
sa.setDuration(1000);
view.startAnimation(sa);
TranslateAnimation ta = new TranslateAnimation(0f, 200f, 0f, 400f);
ta.setDuration(1000);
view.startAnimation(ta);
AnimationSet as = new AnimationSet(true);
as.setDuration(1000);
//从完全透明到完全不透明
AlphaAnimation aa = new AlphaAnimation(0f, 1f);
aa.setDuration(1000);
as.addAnimation(aa);
//从0到原大小的缩放(放大)效果
ScaleAnimation sa = new ScaleAnimation(0f, 1f, 0f, 1f//
, Animation.RELATIVE_TO_SELF, 0.5f//
, Animation.RELATIVE_TO_SELF, 0.5f);
sa.setDuration(1000);
as.addAnimation(sa);
view.startAnimation(as);
Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.scale_animation);
view.startAnimation(anim);
监听动画的开始、重复和结束
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
});
RotateAnimation ra = new RotateAnimation(0f, 359f//
, Animation.RELATIVE_TO_SELF, 0.5f//
, Animation.RELATIVE_TO_SELF, 0.5f);
ra.setDuration(400);
ra.setInterpolator(new LinearInterpolator());//匀速变化
ra.setRepeatCount(-1);//无限重复
view.startAnimation(ra);
由于Android3.0之前的动画框架Animation存在一些局限——动画改变的只是显示的内容,并不能响应事件。因此,Android3.0之后,Google提出了属性动画这样一个动画框架,帮助开发者实现更加丰富的动画效果。
而在Animator框架中使用最多的是AnimatorSet和ObjectAnimator配和,使用ObjectAnimator进行更精细化的控制,只控制对象的一个属性值,而使用多个ObjectAnimator组合到AnimatorSet形成一个动画。
示例:
ObjectAnimator animator= ObjectAnimator.ofFloat(button, "translationX", 0, 200);
animator.setDuration(1000);
animator.start();
与视图动画一样,也可以给属性动画设置时长插值器等属性,这些参数与在视图动画中的设置方法类似。
但是,在设置ObjectAnimator的时候,有一点非常重要,那就是要操纵的属性必须有get、set方法,不然ObjectAnimator就无法起效。下面就是一些常用的可以使用的动画的属性值:
如果一个属性没有get和set方法,那么可通过两种方法来解决。一个是通过自定义一个属性类或者包装类,间接给这个属性设置get和set方法;另一个是通过ValueAnimator来实现。
包装类实现如下:
包装类:
private static class WrapperView{
private View mTarget;
public WrapperView(View target) {
this.mTarget= target;
}
public int getWidth() {
return mTarget.getLayoutParams().width;
}
public void setWidth(int width){
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}
使用方式:
ObjectAnimator animator= ObjectAnimator.ofInt(new WrapperView(button), "width",0, 500);
animator.setDuration(1000);
animator.start();
animator.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
});
或者使用AnimatorListenerAdapter只对必要的事件进行监听:
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
}
});
类似视图中的AnimationSet,在属性动画中,如果要同时操作同一个对象的多个属性,要同时作用多种动画,可以使用PropertyValuesHolder来实现。如下:
PropertyValuesHolder ovh1 = PropertyValuesHolder.ofFloat("translationX",0,300);
PropertyValuesHolder ovh2 = PropertyValuesHolder.ofFloat("translationY",0,150);
PropertyValuesHolder ovh3 = PropertyValuesHolder.ofFloat("scaleX", 1f, 2f, 1f);
PropertyValuesHolder ovh4 = PropertyValuesHolder.ofFloat("scaleY", 1f, 2f, 1f);
ObjectAnimator.ofPropertyValuesHolder(button, ovh1, ovh2, ovh3, ovh4).setDuration(1000).start();
使用AnimatorSet同样可以同时操作一个视图的多个属性,而且,AnimatorSet能够实现更为精确的顺序控制。
使用AnimatorSet实现上面效果的写法为:
ObjectAnimator animator1 = ObjectAnimator.ofFloat(button, "translationX",0f,300f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(button, "translationY",0f,150f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(button, "scaleX",1f, 2f, 1f);
ObjectAnimator animator4 = ObjectAnimator.ofFloat(button, "scaleY",1f, 2f, 1f);
AnimatorSet as = new AnimatorSet();
as.setDuration(1000);
as.playTogether(animator1, animator2, animator3, animator4);
as.start();
Thank you for your support.
THE END