安卓属性动画
安卓动画主要分3种:、和。
补间动画(Tween Animation,又叫视图动画):
通过对场景里的对象不断做图像变换(透明度、缩放、平移、旋转)从而产生动画效果,是一种渐进式动画,并且View动画支持自定义。
帧动画(Frame Animation):
通过顺序播放一系列图像从而产生动画效果。图片过多时容易造成OOM异常。
属性动画(Accribute Animation ):
这也是在android3.0之后引进的动画,在手机的版本上是android4.0就可以使用>这个动 画,它是通过动态改变对象的属性从而达到动画效果。
补间动画只能作用于view,只是改变了view的视图,但view的真实位置还是在原来的地方。属性动画则不存在这种问题。
下面我们着重介绍属性动画:
属性动画
平移动画代码:
/**
* 平移动画
*/
private void startTranslationAnimation(){
//创建动画对象 第一个参数是需要执行动画的目标;第二个参数是动画的类型;第三个是动画执行的参数
ObjectAnimator animator = ObjectAnimator.ofFloat(mTranslateAni,"translationX",400);
animator.setDuration(1000);//设置动画持续时间
animator.setInterpolator(new DecelerateInterpolator());//设置插值器 这个设置的是减速插值器
animator.start();//开始动画
//动画监听 结束后恢复到原样
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
ObjectAnimator animator = ObjectAnimator.ofFloat(mTranslateAni,"translationX",0);
animator.setDuration(1000);
animator.setInterpolator(new DecelerateInterpolator());
animator.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
属性动画主要有两个类来实现,ObjectAnimator和ValueAnimator,其中ObjectAnimator继承自ValueAnimator,通过反射实现了动画功能,创建ObjectAnimator对象时传入了两个参数(values),表示动画执行过程中参数的变化,ObjectAnimator就根据这些参数自动完成动画;而使用ValueAnimator时,虽然也给了两个values,但ValueAnimator不会自动执行动画,而是通过 addUpdateListener 方法监听,在时间插值器的作用下,有序的返回一连串数值,然后通过这些数值,对控件进行设置,达到动画的效果。
综合比较,ObjectAnimator的自动化程度更高,性能相比ValueAnimator更高,所以我这就采用的ObjectAnimator。
另外,在平移动画中只实现了X轴单方向的平移,我们也可以实现X轴和Y轴两个方向的同时移动,实现这种效果我知道的代码有两种写法,两种写法都是同时开始动画,没有先后顺序。
一种是建立两个ObjectAnimator对象,一个是X轴,一个是Y轴,两个对象绑定同一个目标控件,除了平移方向其他的属性都设置的一样,代码如下:
//创建动画对象 第一个参数是需要执行动画的目标;第二个参数是动画的类型;第三个是动画执行的参数
ObjectAnimator animatorX = ObjectAnimator.ofFloat(mTranslateAni,"translationX",400);
animatorX.setDuration(1000);//设置动画持续时间
animatorX.setInterpolator(new DecelerateInterpolator());//设置插值器 这个设置的是减速插值器
animatorX.start();//开始动画
ObjectAnimator animatorY = ObjectAnimator.ofFloat(mTranslateAni,"translationY",400);
animatorY.setDuration(1000);//设置动画持续时间
animatorY.setInterpolator(new DecelerateInterpolator());//设置插值器 这个设置的是减速插值器
animatorY.start();//开始动画
上面就是对平移动画的一个简单介绍,其余的缩放动画、旋转动画和透明度动画和上面的平移动画代码差不多,这里贴出来就不一一介绍了。
缩放动画:
/**
* 缩放动画
*/
private void startScaleAnimation(){
ObjectAnimator animator = ObjectAnimator.ofFloat(mScaleAni,"scaleX",1.0f,0.3f);
animator.setDuration(1000);
animator.setInterpolator(new DecelerateInterpolator());
animator.start();
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
ObjectAnimator animator = ObjectAnimator.ofFloat(mScaleAni,"scaleX",0.3f,1.0f);
animator.setDuration(1000);
animator.setInterpolator(new DecelerateInterpolator());
animator.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
旋转动画:
/**
* 旋转动画
*/
private void startRotationAnimation(){
ObjectAnimator animator = ObjectAnimator.ofFloat(mRotationAni,"rotation",360);
animator.setDuration(1000);
animator.setInterpolator(new DecelerateInterpolator());
animator.start();
}
透明度动画:
/**
* 透明度动画
*/
private void startAlphaAnimation(){
ObjectAnimator animator = ObjectAnimator.ofFloat(mAlphaAni,"alpha",1f,0.3f);
animator.setDuration(1000);
animator.setInterpolator(new DecelerateInterpolator());
animator.start();
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
ObjectAnimator animator = ObjectAnimator.ofFloat(mAlphaAni,"alpha",0.3f,1f);
animator.setDuration(1000);
animator.setInterpolator(new DecelerateInterpolator());
animator.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
最后来看一下组合动画,组合动画中有的是同时发生的,有的是有先后顺序的,直接贴出代码:
同时进行:
/**
* 组合动画
*/
private void startCombinationAnimation(){
PropertyValuesHolder holderTranslationX = PropertyValuesHolder.ofFloat("translationX",0);//X方向平移为0
PropertyValuesHolder holderTranslationY = PropertyValuesHolder.ofFloat("translationY",0);//Y方向平移为0
PropertyValuesHolder holderScaleX = PropertyValuesHolder.ofFloat("scaleX",1,0);//X方向缩放
PropertyValuesHolder holderScaleY = PropertyValuesHolder.ofFloat("scaleY",1,0);//Y方向缩放
PropertyValuesHolder holderRotation = PropertyValuesHolder.ofFloat("rotation",360);//旋转
PropertyValuesHolder holderAlpha = PropertyValuesHolder.ofFloat("alpha",1,0);//透明度
ObjectAnimator.ofPropertyValuesHolder(mCombinationAni,holderTranslationX,holderTranslationY,holderScaleX,holderScaleY,holderRotation,holderAlpha).setDuration(1000).start();
}
同时进行的动画是创建一批你想要实现的动画效果的PropertyValuesHolder对象,跟创建ObjectAnimator对象差不多,不过不需要绑定目标控件,只需要告诉这个对象想要实现的动画效果类型和参数变化值,创建完成后,将所有的动画效果全部设置到ObjectAnimator对象中去,这样就实现了组合动画。
下面是具有先后顺序动画的代码:
/**
* 先后顺序的组合动画
*/
private void startCombinationOrderAnimation(){
AnimatorSet set = new AnimatorSet();
//平移动画
ObjectAnimator animatorTranslation = ObjectAnimator.ofFloat(mCombinationOrderAni,"translationX",400);
animatorTranslation.setDuration(1000);
animatorTranslation.setInterpolator(new DecelerateInterpolator());
//缩放动画
ObjectAnimator animatorScale = ObjectAnimator.ofFloat(mCombinationOrderAni,"scaleX",1f,0.3f);
animatorScale.setDuration(1000);
animatorScale.setInterpolator(new DecelerateInterpolator());
//旋转动画
ObjectAnimator animatorRotation = ObjectAnimator.ofFloat(mCombinationOrderAni,"rotation",360);
animatorRotation.setDuration(1000);
animatorRotation.setInterpolator(new DecelerateInterpolator());
//透明度动画
ObjectAnimator animatorAlpha = ObjectAnimator.ofFloat(mCombinationOrderAni,"alpha",1f,0.3f);
animatorAlpha.setDuration(1000);
animatorAlpha.setInterpolator(new DecelerateInterpolator());
//设置动画的先后顺序
set.play(animatorTranslation).before(animatorScale);
set.play(animatorScale).before(animatorRotation);
set.play(animatorRotation).before(animatorAlpha);
set.start();
}
代码实现就是创建一个AnimatorSet对象,再创建你想要实现的动画ObjectAnimator对象, AnimatorSet对象调用方法play和before,传入ObjectAnimator对象,达到动画的效果。
AnimatorSet中主要通过四个方法来实现顺序:
AnimatorSet.play(Animator anim1).with(Animator anim2)表示两个动画同时进行;
AnimatorSet.play(Animator anim1).after(Animator anim2)表示anim1在anim2之后进行;
AnimatorSet.play(Animator anim1).befor(Animator anim2)表示anim1在anim2之前进行;
除了以上代码能后实现顺序执行动画,也可以通过添加监听的方法实现,还可以设置定时执行动画来达到效果,也可以采用延时的方法实现,总之代码千万种,效果就一种,都可以。
好了,以上就是本人现阶段对属性动画的一个认识,在此记录一下,以后备用。