Android的动画可以分为3种:view动画,帧动画,属性动画,其实帧动画也属于view动画的一种,只不过它和平移,旋转等常见的view动画在表现形式上略有不同而已
view动画:
就是对场景的对象做不同的变换(平移,缩放,旋转,透明度)从而产生动画效果,是一种渐进式动画
帧动画:
类似播放电影,一帧一帧的播放,它通过顺序播放一系列图像从而产生动画效果,但是如果图片较大,会导致OOM
属性动画:
通过动态的改变对象的属性从而达到动画效果,属性动画是API11的新特性,在低版本中无法使用,但是我们可以通过兼容库来兼容它
下面来看看各种动画的特性
view动画
view动画的对象是view,它支持4种动画效果,平移,缩放,旋转,透明度,这4种动画效果对应着Animation的子类:TranslateAnimation(平移),ScaleAnimation(缩放),RotateAnimation(透明度),AlphaAnimation(透明度),这4种属性都可以用xml来定义,我们来看看一张图表:
可以看到不同的动画对应的xml标签是不同的,我们要在xml中使用动画属性,首先需要创建一个xml文件,这个文件的路径是:res/anim/xxx.xml,然后我们就可以在里面写我们自己需要的动画效果,动画效果可以分为2种,一种是单个动画效果,一种是组合动画效果,下面我们看看怎么实现这两种效果,首先我们在res下新建个文件夹叫anim,然后再里面新建两个xml,分别是单个动画效果和组合动画效果
单个动画效果:
translate.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--
duration:表示动画持续时间,单位毫秒
fromXDelta:表示动画开始时的x坐标
fromYDelta:表示动画开始时的y坐标
toXDelta:表示动画结束时的x坐标
toYDelta:表示动画结束时的y坐标
注意: 没有指定fromXType toXType fromYType toYType 时候, 默认是以自己为相对参照物
-->
<translate
android:duration="2000"
android:fromXDelta="30"
android:fromYDelta="30"
android:toXDelta="-80"
android:toYDelta="300" />
</set>
alpha.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--
duration:表示动画持续时间,单位毫秒
fromAlpha:表示动画开始时的透明度
toAlpha:表示动画结束时的透明度
-->
<alpha
android:duration="1000"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
scale.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<!--
duration:表示动画持续时间,单位毫秒
interpolator:插值器,影响动画播放的速度,如加速,减速,加速-减速,
决定这个动画效果是以怎样的速度播放,加速播放,减速播放,还是先加速再减速播放
默认是@android:anim/accelerate_decelerate_interpolator,即加速-减速
加速:accelerate_interpolator
减速:decelerate_interpolator
fillAfter:表示动画结束后是否停留在最后一帧,true表示停留,false表示不停留
fromXScale:表示动画初始时的缩放的x坐标
fromYScale:表示动画初始时的缩放的y坐标
pivotX:表示缩放的x坐标百分比(x坐标缩放多大)
pivotY:表示缩放的y坐标百分比(y坐标缩放多大)
toXScale:表示动画结束时缩放的x坐标
toYScale:表示动画结束时缩放的y坐标
-->
<scale
android:duration="1000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fillAfter="false"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.4"
android:toYScale="1.4" />
</set>
rotate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--
duration:表示动画持续时间,单位毫秒
fromDegrees:表示初始时动画旋转的角度
interpolator:插值器,影响动画播放的速度,如加速,减速,加速-减速,
决定这个动画效果是以怎样的速度播放,加速播放,减速播放,还是先加速再减速播放
默认是@android:anim/accelerate_decelerate_interpolator,即加速-减速
加速:accelerate_interpolator
减速:decelerate_interpolator
pivotX:表示缩放的x坐标百分比(x坐标旋转多大)
pivotY:表示缩放的y坐标百分比(y坐标旋转多大)
toDegrees:表示结束时动画旋转的角度
-->
<rotate
android:duration="3000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="+350" />
</set>
上面这4个就是单个动画效果的写法,现在我们来看看多种动画效果组合
组合动画效果:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="2000"
android:fromXDelta="30"
android:fromYDelta="30"
android:toXDelta="-80"
android:toYDelta="300" />
<rotate
android:duration="3000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="+350" />
</set>
非常的简单,就是将多个不同的动画组合在set标签里面,现在我们来看看怎么用,非常简单
myView = (MyView) findViewById(R.id.myView);
Animation animation= AnimationUtils.loadAnimation(this,R.anim.translate);
myView.startAnimation(animation);
我们通过AnimationUtils.loadAnimation();来获取到我们动画布局,第一个参数是上下文,第二个就是对应的动画xml文件,然后view.startAnimation开启动画就可以了,另外,我们也可以通过代码来实现动画效果:
AlphaAnimation animation=new AlphaAnimation(0,1);
animation.setDuration(300);
myView.startAnimation(animation);
创建一个透明度的动画效果,设置它在300ms内透明度由0到1,这跟我们通过xml去实现的效果是一样,就不做过多的介绍,另外,我们可以监听动画变化过程:
myView.setLayoutAnimationListener(new Animation.AnimationListener() {
//动画开启前
@Override
public void onAnimationStart(Animation animation) {
}
//动画结束后
@Override
public void onAnimationEnd(Animation animation) {
}
//动画进行时
@Override
public void onAnimationRepeat(Animation animation) {
}
});
好了,关于view动画的介绍就到这了