前面学了帧动画:
动画合集之补间动画
和帧动画不同(帧动画是通过连续播放图片来模拟动画效果),补间动画只需要开发者提供动画开始和动画结束时的“关键帧”,变化时的“中间帧”则由Android系统来计算并补齐。
一、补间动画的分类
补间动画共有以下五种:
- AlphaAnimation:透明度渐变效果,对应<alpha/>标签。
创建时指定开始以及结束透明度,透明度的变化范围(0,1),0是完全透明,1是完全不透明。 - ScaleAnimation:缩放渐变效果,对应<scale/>标签。
创建时指定开始以及结束的缩放比,以及缩放参考点。 - TranslateAnimation:位移渐变效果,对应<translate/>标签。
创建时指定起始以及结束位置即可。 - RotateAnimation:旋转渐变效果,对应<rotate/>标签。
创建时指定动画起始以及结束的旋转角度和旋转的轴心。 - AnimationSet:组合渐变,对应<set/>标签,就是前面多种渐变的组合。
最后,就是所有动画都要指定以下持续的时间。
二、Interpolator(插值器)
在使用动画前,要先掌握一个知识点:Interpolator。
它可以用来控制动画的变化速度,Android中已经为我们提供了多个可供选择的实现类,我们也可以自己实现Interpolator 接口,用来自己控制动画的变化速度。下面看下系统的几个:
- LinearInterpolator:动画以均匀的速度改变
- AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速
- AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,中间时加速
- CycleInterpolator:动画循环播放特定次数,变化速度按正弦曲线改变: Math.sin(2 * mCycles * Math.PI * input)
- DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速
- AnticipateInterpolator:反向,先向相反方向改变一段再加速播放
- AnticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
- BounceInterpolator: 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
- OvershottInterpolator:回弹,最后超出目的值然后缓慢改变到目的值
插值器也有对应的xml属性:android:interpolator。我们可以通过xml给动画添加插值器,示例:
@android:anim/accelerate_decelerate_interpolator。其他插值器也是类似的命名。
三、动画的定义和使用
我把动画的使用归纳为两个步骤:
1、定义动画(有静态的,即xml;也有动态代码的)
2、使用动画
下面先来看一下各种动画的静态(xml)定义:
首先自然是创建xml文件,如下:

1)AlphaAnimation(透明度渐变)
anim_alpha.xml:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
>
<!--
fromAlpha :起始透明度
toAlpha:结束透明度
透明度的范围为:0-1,完全透明-完全不透明
-->
</alpha>
2)ScaleAnimation(缩放渐变)
anim_scale.xml:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXScale="0.2"
android:fromYScale="0.2"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="0.5"
android:pivotY="0.5"
android:toXScale="1.5"
android:toYScale="1.5">
<!--
fromXScale/fromYScale:沿着X轴/Y轴缩放的起始比例
toXScale/toYScale:沿着X轴/Y轴缩放的结束比例
pivotX/pivotY:缩放的中轴点X/Y坐标,即距离自身左边缘的位置,比如50%就是以图像的 中心为中轴点
-->
</scale>
3)TranslateAnimation(位移渐变)
anim_translate.xml:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:toXDelta="320"
android:toYDelta="320">
<!--
fromXDelta/fromYDelta:动画起始位置的X/Y坐标
toXDelta/toYDelta:动画结束位置的X/Y坐标
-->
</translate>
4)RotateAnimation(旋转渐变)
anim_rotate.xml:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/p1"
android:duration="3000"
android:fromDegrees="0"
android:interpolator="@android:anim/anticipate_overshoot_interpolator"
android:repeatCount="2"
android:repeatMode="restart"
android:toDegrees="360">
<!--
fromDegrees/toDegrees:旋转的起始/结束角度
repeatCount:旋转的次数,默认值为0,代表一次,假如是其他值,比如3,则旋转4次 另外,值为-1或者infinite时,表示动画永不停止
repeatMode:设置重复模式,默认restart,但只有当repeatCount大于0或者infinite或-1时 才有效。
还可以设置成reverse,表示偶数次显示动画时会做方向相反的运动!
-->
</rotate>
5)AnimationSet(组合渐变)
anim_set.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/bounce_interpolator"
android:shareInterpolator="true">
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXScale="0.2"
android:fromYScale="0.2"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="0.5"
android:pivotY="0.5"
android:toXScale="1.5"
android:toYScale="1.5">
</scale>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toAlpha="0.0">
</alpha>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:toXDelta="320"
android:toYDelta="320">
</translate>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/p1"
android:duration="3000"
android:fromDegrees="0"
android:interpolator="@android:anim/anticipate_overshoot_interpolator"
android:repeatCount="2"
android:repeatMode="restart"
android:toDegrees="360">
</rotate>
</set>
定义完动画,接下来就是使用了:
使用动画的核心代码就两行:
animation = AnimationUtils.loadAnimation(this,
R.anim.anim_alpha);
img_show.startAnimation(animation);
下面放一个完整的使用例子:
/**
* @author Li Zongwei
*/
public class TweenAnimActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_alpha;
private Button btn_scale;
private Button btn_tran;
private Button btn_rotate;
private Button btn_set;
private ImageView img_show;
private Animation animation = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tween_anim);
bindViews();
}
private void bindViews() {
btn_alpha = findViewById(R.id.btn_alpha);
btn_scale = findViewById(R.id.btn_scale);
btn_tran = findViewById(R.id.btn_tran);
btn_rotate = findViewById(R.id.btn_rotate);
btn_set = findViewById(R.id.btn_set);
img_show = findViewById(R.id.img_show);
btn_alpha.setOnClickListener(this);
btn_scale.setOnClickListener(this);
btn_tran.setOnClickListener(this);
btn_rotate.setOnClickListener(this);
btn_set.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_alpha:
animation = AnimationUtils.loadAnimation(this,
R.anim.anim_alpha);
img_show.startAnimation(animation);
break;
case R.id.btn_scale:
animation = AnimationUtils.loadAnimation(this,
R.anim.anim_scale);
img_show.startAnimation(animation);
break;
case R.id.btn_tran:
animation = AnimationUtils.loadAnimation(this,
R.anim.anim_translate);
animation.setFillAfter(true);
img_show.startAnimation(animation);
break;
case R.id.btn_rotate:
animation = AnimationUtils.loadAnimation(this,
R.anim.anim_rotate);
img_show.startAnimation(animation);
break;
case R.id.btn_set:
animation = AnimationUtils.loadAnimation(this,
R.anim.anim_set);
img_show.startAnimation(animation);
break;
default:
}
}
}
另外,还可以为动画设置监听:
setAnimationListener(new AnimationListener())方法,重写下面的三个方法即可:
- onAnimationStart():动画开始
- onAnimtaionRepeat():动画重复
- onAnimationEnd():动画结束
三、总结
补间动画主要得掌握五种动画的使用,它们的属性有什么,对应什么样的效果。
学习动画主要是为自定义View做准备,在自定义View的时候,经常使用到动画,掌握动画的基本使用,以及一些常见的属性,包括插值器等概念,对后面的学习大有益处。
不过这个东西嘛,也不用死记硬背,主要还是要多使用,用多了,各种api及其参数也就印象深刻了。
写于:2020/09/18
网友评论