本文将介绍Android动画的实现技术。Android动画实现有三种技术,逐帧动画(Drawable Animation),补间动画(View Animation)和属性动画(Property Animation)。下面列出了三者的特点:
- 逐帧动画
图片一帧帧的播放,类似动画片 - 补间动画
将原始图片进行一系列的变换:平移,选择,缩放,淡入淡出。
缺陷
1) 只能对view进行变换,不能对自定义的非view对象进行变换,如自定义个代表点位置的Point类
2) 不支持四种变换外的其他变换,如更换背景
3) 只改变view的效果,不改变view的属性,如移动到新的位置后不响应点击事件 - 属性动画
1) 实现真正的移动
2) 进行丰富的变换
逐帧动画和补间动画局限性比较大,属性动画的效果更加丰富完善,接下来我们介绍属性动画的使用方法。
属性动画主要涉及到三个类,ValueAnimator,ObjectAnimator和AnimatorSet。其中ValueAnimator用于对数值进行动画处理,ObjectAnimator用于对对象的某个属性进行动画处理,而AnimatorSet则用于组合动画的实现。
ValueAnimator:实现300毫秒内从0平滑变换到1。
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
Log.d("TAG", "cuurent value is " + currentValue);
}
});
anim.start();
ObjectAnimator:实现将Textview的translationX属性在1000毫秒内从当前值向左移100像素。
float curTranslationX = textView.getTranslationX();
ObjectAnimator moveLeftAnim = ObjectAnimator.ofFloat(textView, "translationX",
curTranslationX, curTranslationX - 100);
moveLeftAnim.setDuration(1000);
moveLeftAnim.start();
AnimatorSet:组合动画,Textview先从屏幕左侧进入屏幕中心,然后旋转360度同时先变淡后变深。
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
AnimatorListener:Animator监听器,可以给动画效果添加监听器,处理开始动画,结束动画,重复动画,取消动画的事件
anim.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:提供了AnimatorListener四种回调函数的默认实现,可以按需重写某个监听事件。
anim.addListener(new AnimatorListenerAdapter() {
});
使用XML编写动画:通过XML编写动画,可以实现动画的重用。为了区别,一般把补间动画的xml放在res/anim文件夹下,属性动画xml放在res/animator文件夹下。
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" >
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="-500"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="together" >
<objectAnimator
android:duration="3000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="sequentially" >
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:="floatType" >
</objectAnimator>
</set>
</set>
</set>
调用方式如下:
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
参考:
https://developer.android.com/guide/topics/graphics/overview.html
http://blog.csdn.net/guolin_blog/article/details/43536355