在Android中,动画有帧动画、补间动画、属性动画、VectorDrawable,可以做出各种华丽的效果。那它们之间有什么区别呢?我们来慢慢分析。
1.帧动画
帧动画就是常说的Frame动画,Frame动画用一系列微小差异的图片按照顺序快速展示,从而达到了动画的效果,是不是想到了这货和放电影不是一样吗?是的。
Frame动画可以由XML代码写也可以用Java代码写:
xml代码
如果用xml代码写的话,xml文件可以放置在/res下的anim或者drawable中,文件名作为资源id就在代码中引用,
元素指向一个图片,android:onshot如果定义为true,这个动画会执行一次,如果为false它就会无限循环,android:drawable指定图片,android:duration指定此帧持续的时间,单位是ms
java代码
用Java的话,需要用到AnimationDrawable对象,播放动画时用start()这个方法。
2.补间动画
补间动画也中tween动画,tween意思是在两者之间,在...中间,tween动画其实是操控某个控件进行旋转、移动、渐变、缩放从而达到动画的效果,同样可以用java代码或xml来写。
xml代码:
xml文件必须放在/res/anim下,xml的根元素可以是
android:interpolator 代表一个插值器资源,可以引用系统自带的插值器资源,资源id在@android:anim/下,
android:fromAlpha 代表起始属性值,是一个浮点值从0.0到1.0,分别代表通明和完全不通明。
android:toAlpha 代表结尾alpha值,是一个浮点值从0.0到1.0,分别代表通明和完全不通明。
android:fromXScale代表起始的从X方向相对自身的缩放比例,1.0代表无变化,0.5缩小一倍,2.0表示放大一倍。
android:toXScale代表结束的从X方向相对自身的缩放比例,1.0代表无变化,0.5缩小一倍,2.0表示放大一倍。
android:privotX 代表缩放中轴点X坐标,android:privotY 代表缩放中轴点Y坐标,如果我们想把中轴点的中心表示为图像的中心可以设置为0.5
android:fromXDelta,表示起始X方向的位置,
android:toXDelta表示X方向结束的位置,
单位如果用浮点数表示,代表原始位置像素值,num%表示相对于自己位置的百分比,num&p表示相对于父类组件的百分比。
建议单位用百分比比较好,在不同手机上误差小。
android:fromDegress代表起始角度,浮点值
android:toDegress代表结束角度,浮点值
android:pivotX
android:pivotY
这两个属性代表旋转中心,也有三种表示方式,数字方式代表像素值、num%和num%p;
tween动画比较简单只能用在View对象之上,局限性较大。
3属性动画
在Android3.0以后Android推出了属性动画。
ValueAnimator是属性动画最核心的一个类,它的作用是在不断的修改对象的值来实现动画的效果。
属性动画每次更新时都会调用onAnimationUpdate方法,用这个方法可以获取属性的最新值。
xml:
然后在Java代码中加载该动画
ValueAnimator animator = AnimatorInflater.loadAnimator(getApplicationContext(),R.anim.value_animation);
动画更新时调用 onAnimationValueUpdate方法
public void onAnimationValueUpdate(ValueAnimator animation)
{
float newValue = (Float) animation.getAnimatedValue();
myView.setAlpha(newValue);
}
ValueAnimator虽然自定义程度高,但是开发效率低下,而ObjectAnimaor会显得更好用。
ObjectAnimator animator = ObjectAnimator.ofFloat(myView,"alpha",1.0f,0.3f,0.7f);
animation.setDuration(2000);
animation.start();
ObjectAnimator通过ofFloat静态工厂方法来构建ObjectAnimator对象,以上代码是将myView这个控件在2秒内通明度从1.0变为0.3最后变为0.7f。
如果想让多个动画组合起来可以使用PropertyValuesHolder,也可以使用AnimaorSet,AnimationSet调用playTogether就可以让多个ObjectAnimator对象加入进来。
android 3.0以后增加给View增加了一个animate()方法来直接驱动属性动画,其实animate可以说是属性动画的一种简写方式。
btn.animate()
.setDuration(2000)
.alpha(0.5f)
.scaleX(1.5f)
.withStartAction(new Runnable() {
@Override
public void run() {
}
})
.withEndAction(new Runnable() {
@Override
public void run() {
}
})
.start();
Android布局动画
最简单可以为ViewGoup设置android:animateLayoutChanges="true"这是系统默认的不能更改。
也可以用LayoutAnimationController类定义一个实现过渡效果的View
ll = (LinearLayout) findViewById(R.id.ll);
ScaleAnimation animation = new ScaleAnimation(0,1,0,1);
animation.setDuration(2000);
LayoutAnimationController controller = new LayoutAnimationController(animation,0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
ll.setLayoutAnimation(controller);
不过好像并没有什么效果。
自定义动画
需要实现applyTransfromation,还需要覆盖initialize()方法。
android 5.0以上 svg矢量动画。