Android动画主要有三种:view动画,帧动画,属性动画。
1.view动画:
也叫补间动画,通过对场景的对象不断做图像变换(平移,缩放,旋转,透明度)从而产生动画效果,是一种渐进式动画。
四种动画效果对应四种子类:
动画效果 | 标签 | java类 |
平移动画 | TranslateAnimation | |
缩放动画 | ScaleAnimation | |
旋转动画 | RotateAnimation | |
透明度动画 | AlphaAnimation |
使用view动画,首先要创建动画的xml文件,文件路径为:res/res/anim/animation_test.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android1="http://schemas.android.com/apk/res/android"
android:duration="2000"
android1:fillAfter="false"
android:repeatMode="reverse"
android:shareInterpolator="true"
android:startOffset="500"
android:zAdjustment="normal">
<rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="3"
android:toDegrees="360"
/>
<scale
android:fromXScale="50%"
android:fromYScale="50%"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="3"
android:toXScale="100%"
android:toYScale="100%"
/>
<translate
android:fromXDelta="-30%p"
android:fromYDelta="0"
android:repeatCount="3"
android:toXDelta="30%p"
android:toYDelta="0"
/>
<alpha
android:fromAlpha="1"
android:repeatCount="3"
android:toAlpha="0.2"
/>
</set>
设置动画
/**
*动画测试*
* */
//补间动画
animation = AnimationUtils.loadAnimation(this, R.anim.animation_test);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Toast.makeText(MainActivity.this, "补间动画开始", Toast.LENGTH_LONG).show();
}
@Override
public void onAnimationEnd(Animation animation) {
Toast.makeText(MainActivity.this, "补间动画结束", Toast.LENGTH_LONG).show();
}
@Override
public void onAnimationRepeat(Animation animation) {
Toast.makeText(MainActivity.this, "补间动画重复", Toast.LENGTH_LONG).show();
}
});
testButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
testButton.startAnimation(animation);
}
});
动画效果:
编辑
2.帧动画:
顺序播放一组预先设定好的图片,类似与电影的播放。系统提供AnimationDrawable类来使用帧动画
先创建帧动画的xml布局,路径为res/drawable/anim_frame_test
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android1="http://schemas.android.com/apk/res/android"
android1:oneshot="false"
>
<item
android1:drawable="@drawable/emoji1"
android1:duration="200"
/>
<item
android1:drawable="@drawable/emoji2"
android1:duration="200"
/>
<item
android1:drawable="@drawable/emoji3"
android1:duration="200"
/>
<item
android1:drawable="@drawable/emoji4"
android1:duration="200"
/>
<item
android1:drawable="@drawable/emoji5"
android1:duration="200"
/>
<item
android1:drawable="@drawable/emoji6"
android1:duration="200"
/>
</animation-list>
设置动画
........
//帧动画
mAnimationDrawable = new AnimationDrawable();
mAnimationDrawable.setOneShot(false);
for(int i = 1; i<7; i++){
int id = getResources().getIdentifier("emoji" + i, "drawable", getPackageName());
Drawable drawable = ContextCompat.getDrawable(this, id);
mAnimationDrawable.addFrame(drawable, 200);
}
testImage.setImageDrawable(mAnimationDrawable);
startAnim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mAnimationDrawable.start();
}
});
stopAnim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mAnimationDrawable.stop();
}
});
动画效果:
编辑
至此就实现了帧动画的完整过程
3.属性动画:
3.0之前只有view动画和帧动画,这两种动画只改变view的视觉效果,对其属性无影响。所以加入了属性动画。
在动画持续时间内,通过不断对值进行改变,并不断将该值赋给对象,从而实现该对象在任意属性上的动画效果。
利用属性动画组合实现view动画的四种操作。
//propertyAnimationTest
public void animatorSet(View view) {
// 顺序执行
AnimatorSet set1 = new AnimatorSet();
ObjectAnimator translationAnimator1 = ObjectAnimator.ofFloat(view, "translationX", -400);
ObjectAnimator translationAnimator2 = ObjectAnimator.ofFloat(view, "translationY", 400);
ObjectAnimator translationAnimator3 = ObjectAnimator.ofFloat(view, "translationX", 300);
ObjectAnimator translationAnimator4 = ObjectAnimator.ofFloat(view, "translationY", 0);
ObjectAnimator translationAnimator5 = ObjectAnimator.ofFloat(view, "translationX", 0);
set1.playSequentially(translationAnimator1, translationAnimator2, translationAnimator3, translationAnimator4, translationAnimator5);
// 设置动画时长,这里的时长是每个子动画的时长
set1.setDuration(5000);
// 同时执行
AnimatorSet set2 = new AnimatorSet();
ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(view, "rotationY", 0, 360);
ObjectAnimator scaleAnimator1 = ObjectAnimator.ofFloat(view, "scaleX", 0.2f, 1);
ObjectAnimator scaleAnimator2 = ObjectAnimator.ofFloat(view, "scaleY", 0.2f, 1);
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(view, "alpha", 0.2f, 1);
set2.playTogether(rotationAnimator, scaleAnimator1, scaleAnimator2, alphaAnimator);
// 设置动画时长,这里的时长是每个子动画的时长
set2.setDuration(5000);
AnimatorSet set = new AnimatorSet();
set.playTogether(set1,set2);
set.start();
}
//属性动画
slide_view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
animatorSet(slide_view);
}
});
动画效果:
编辑
4.插值器与估值器
TimeInterpolator:时间插值器,根据时间流逝的百分比来计算当前属性值改变的百分比。
AcclerateDecelerateInterpolator:加减速插值器,动画两头慢中间快
DecelerateInterpolator:减速插值器,动画越来越慢
TypeEvaluator:类型估值算法,也叫估值器,根据当前属性改变的百分比来计算改变后的属性值
IntEvaluator:(针对整形属性) FloatEvaluator(针对浮点型属性) ArgbEvalutor(针对Color属性)
属性动画中插值器和估值器是实现非匀速动画的重要手段。
5.属性动画的监听器
提供监听器用于监听动画的播放过程,主要提供了两个接口
AnimatorUpdataListener 和AnimatorListener
AnimatorUpdataListener 可监听动画的每一帧,AnimatorListener可监听动画的开始,结束,取消以及重复播放。