1.Android中补间动画的分类
在Android中,补间动画一共分为4类,分别是:
- 灰度动画:AlphaAnimation
- 平移动画:TranslateAnimation
- 缩放动画:ScaleAnimation
- 旋转动画:RotateAnimation
2.四大补间动画父类及其常用方法
Android中的四个补间动画都来自于共同的动画类Animation。这里我们说一下Animation的常用方法。
- setFillAfter:设置是否维持结束画面。true表示动画结束后停留在结束画面,false表示动画结束后恢复到开始画面。
- setRepeatMode:设置重复模式。Animation.RESTART表示从头开始,Animation.REVERSE表示倒过来开始。默认为Animation.RESTART。
- setRepeatCount:设置重播次数。默认为0表示只播放一次。
- setDuration:设置动画的持续时间。单位毫秒。
- setInterpolator:设置动画的插值器。
- setAnimationListener:设置动画事件的监听器。需实现接口AnimationListener的3个方法。
onAnimationStart | 在动画开始时触发 |
onAnimationEnd | 在动画结束时触发 |
onAnimationRepeat | 在动画重播时触发 |
3.补间动画对宿主视图的要求
补间动画的宿主视图可以是任意视图,只要派生自View类就行。
4.宿主视图开启关闭补间动画
调用宿主对象的startAnimation方法即可命令宿主视图开始动画,调用宿主对象的clearAnimation方法即可要求宿主视图清除动画。
5.补间动画初始化方式对比
- 初始化灰度动画:在构造函数中指定视图透明度的前后数值。取值为0.0~1.0,0表示完全不透明,1表示完全透明。
- 初始化平移动画:在构造函数中指定视图左上角在平移前后的坐标值。其中,第一个参数为平移前的横坐标,第二个参数为平移后的横坐标,第三个参数为平移前的纵坐标,第四个参数为平移后的纵坐标。
- 初始化缩放动画:在构造函数中指定视图横纵坐标的前后缩放比例。缩放比例取值0.5表示缩小到原来的二分之一,取值2表示放大到原来的两倍。其中,第一个参数为缩放前的横坐标比例,第二个参数为缩放后的横坐标比例,第三个参数为缩放前的纵坐标比例,第四个参数为缩放后的纵坐标比例。
- 初始化旋转动画:在构造函数中指定视图的旋转角度。其中,第一个参数为旋转前的角度,第二个参数为旋转后的角度,第三个参数为圆心的横坐标类型,第四个参数为圆心横坐标的数值比例,第五个参数为圆心的纵坐标类型,第六个参数为圆心纵坐标的数值比例。坐标类型的取值说明如下表
Animation类的坐标类型 | 说明 |
ABSOLUTE | 绝对位置 |
RELATIVE_TO_SELF | 相对自身位置 |
RELATIVE_TO_PARENT | 相对上级位置 |
6.四种补间动画代码示例
灰度动画示例
public class MainActivity extends AppCompatActivity{
private View view;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = findViewById(R.id.view);
//创建一个灰度动画
AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f,0.1f);
alphaAnimation.setDuration(3000);
alphaAnimation.setFillAfter(true);
view.startAnimation(alphaAnimation);
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f,1.0f);
alphaAnimation.setDuration(3000);
alphaAnimation.setFillAfter(true);
view.startAnimation(alphaAnimation);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
}
平移动画示例
public class MainActivity extends AppCompatActivity{
private View view;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = findViewById(R.id.view);
//创建一个平移动画
TranslateAnimation translateAnimation = new TranslateAnimation(1.0f,-100,1.0f,1.0f);
translateAnimation.setDuration(3000);
translateAnimation.setFillAfter(true);
view.startAnimation(translateAnimation);
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
TranslateAnimation translateAnimation = new TranslateAnimation(-100,1.0f,1.0f,1.0f);
translateAnimation.setDuration(3000);
translateAnimation.setFillAfter(true);
view.startAnimation(translateAnimation);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
}
缩放动画示例
public class MainActivity extends AppCompatActivity{
private View view;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = findViewById(R.id.view);
//创建一个缩放动画
ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f,1.0f,1.0f,0.5f);
scaleAnimation.setDuration(3000);
scaleAnimation.setFillAfter(true);
view.startAnimation(scaleAnimation);
scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f,1.0f,0.5f,1.0f);
scaleAnimation.setDuration(3000);
scaleAnimation.setFillAfter(true);
view.startAnimation(scaleAnimation);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
}
旋转动画示例
public class MainActivity extends AppCompatActivity{
private View view;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = findViewById(R.id.view);
//创建一个旋转动画
RotateAnimation rotateAnimation = new RotateAnimation(0f,360f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(3000);
rotateAnimation.setFillAfter(true);
view.startAnimation(rotateAnimation);
rotateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
RotateAnimation rotateAnimation = new RotateAnimation(0f,-360f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(3000);
rotateAnimation.setFillAfter(true);
view.startAnimation(rotateAnimation);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
}