简介
Android动画主要有三种类型:View动画、帧动画和属性动画。其中,帧动画也是View动画的一种,它通过顺序播放一系列图像而产生动画效果,只不过它和一般的平移、旋转等View动画在表现形式上略有不同。而属性动画是API11的新特性,在Android 3.0以下版本的手机中无法使用。下面主要介绍View动画。
View动画是一种作用于View对象的动画,它支持4种动画效果,分别为平移(translate)、旋转(rotate)、缩放(scale)和透明度(alpha)。这四种动画分别对应于Android中的TranslateAnimation、RotateAnimation、ScaleAnimation和AlphaAnimation这四个类。这几种动画均可以通过XML格式定义或通过Java代码动态创建。
实现原理
每次绘制视图时,View所在的ViewGroup中的drawChild函数会获取该view的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix())函数,通过内部的矩阵运算完成动画帧。如果动画没有完成,就继续调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。由此可见,View动画其实是一个矩阵运算的过程。
优缺点
优势:使用简单,兼容性好
缺陷:
- 不具备交互性,View动画作用的实际上是View的影像,而非真正改变了View的属性状态。也就是说,View动画结束后,即便使用setFillAfter(true)使得view保持在动画结束时的位置,view的真实位置依旧未发生变化,仍然处于最开始定义时的位置。因此,当view动画结束后,其响应位置仍然位于动画开始前的位置,这就使得其不具备交互性;
- View动画只能作用于View对象,且提供的动画种类有限;
View动画的使用
通过Java代码动态创建动画
步骤:
- 创建TranslateAnimation、RotateAnimation、ScaleAnimation或AlphaAnimation对象;
- 设置创建的动画对象的属性,如动画执行时间、延迟时间、起始位置、结束位置等;
- 通过View.startAnimation()方法开启动画;
注:可以通过Animation.setAnimationListener()设置动画的监听器,监听动画的开始、结束和重复状态,并在必要的时候添加自己的操作;
示例:
- 平移动画:
TranslateAnimation translate = new TranslateAnimation(0, 120, 0, 100);
translate.setFillAfter(true);
translate.setDuration(1000);
image.startAnimation(translate);
- 旋转动画:
final RotateAnimation rotate1 = new RotateAnimation(0, 360); // 围绕自己的左上角向右旋转360度
final RotateAnimation rotate2 = new RotateAnimation(0, 90, Animation.RELATIVE_TO_PARENT, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f); // X轴坐标向右偏移0.5倍父控件宽度,Y轴坐标向下偏移0.5倍自身宽度,然后围绕该点向右旋转90度
rotate1.setDuration(1000); //设置动画时长
// 设置动画事件监听器
rotate1.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Toast.makeText(mContext, "Start rotate", Toast.LENGTH_SHORT).show();
}
@Override
public void onAnimationEnd(Animation animation) {
Toast.makeText(mContext, "End rotate", Toast.LENGTH_SHORT).show();
rotate2.setDuration(1000);
image.startAnimation(rotate2);
}
@Override
public void onAnimationRepeat(Animation animation) {
Toast.makeText(mContext, "Repeat rotate", Toast.LENGTH_SHORT).show();
}});
image.startAnimation(mAnimation); // 开始动画
+ 缩放动画:
```Java
ScaleAnimation scale = new ScaleAnimation(1, 1.5f, 1, 1.5f, Animation.RELATIVE_TO_PARENT, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
scale.setFillAfter(true);
scale.setDuration(1000);
image.startAnimation(scale);
- 透明度动画:
AlphaAnimation alpha = new AlphaAnimation(1, 0);
alpha.setDuration(1000);
alpha.setRepeatMode(Animation.REVERSE); //设置重复模式
alpha.setRepeatCount(5); //设置重复次数
image.startAnimation(alpha);
+ 动画集:
```Java
AnimationSet as = new AnimationSet(true); // 动画集共享插值器
as.setDuration(3000);AlphaAnimation aa = new AlphaAnimation(0. 1);
aa.setDuration(1000);
as.addAnimation(aa);
TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 100);
ta.setDuration(1000);
as.addAnimation(ta);
image.startAnimation(as);
属性解析:
- 动画的原点默认为控件自身的左上角,向右为X轴正向,向下为Y轴正向
- 动画常见共有属性:
- setInterpolator(Interpolator i):设置动画插值器(后面解释),即设置动画的加速模式,默认为线性插值器(匀速变化),还可以设置为AccelerateDecelerateInterpolator、AccelerateInterpolator等,或者自定义
- setFillAfter(boolean fillAfter): 动画结束后是否保持在结束状态,true表示保持在结束时的状态,false表示返回开始前的状态
- setFillBefore(boolean fillBefore):true表示动画结束时,画面停留在第一帧
- setDuration(long durationMillis):动画持续时长,单位:毫秒
- setRepeatCount(int repeatCount):动画重复次数,-1表示无限循环
- setRepeatMode(int repeatMode):动画重复模式,为RESTART或REVERSE
- setStartTime(long startTimeMillis):动画开始时间,以毫秒表示
- setStartOffset(long startOffset):动画延迟时长,即延迟startOffset毫秒开始动画,当startOffset>0时,动画开始时间为startTimeMillis+startOffset
- setZAdjustment(int zAdjustment):动画过程中Z轴方向的模式,默认为normal
- 平移动画属性:
public TranslateAnimation(Context context, AttributeSet attrs);
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta,
float toYDelta);
public TranslateAnimation(int fromXType, float fromXValue, int toXType,
float toXValue, int fromYType, float fromYValue, int toYType, float toYValue);
如上为TranslateAnimation的三个构造方法,最终均为了设置第三个构造方法中的几个参数所对应的TranslateAnimation属性值,所以下面分别介绍这些属性的含义。
fromXType 和 fromXValue:这俩属性分别表示平移起点X轴方向的偏移类型和偏移量,fromXType有三种取值可选,分别为Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF 和 Animation.RELATIVE_TO_PARENT;
fromXType取值为Animation.ABSOLUTE时,表示X轴方向的平移起点绝对平移fromXValue个像素点,此时fromXValue为一个绝对像素值;
fromXType取值为Animation.RELATIVE_TO_SELF时,表示X轴方向的平移起点相对自身平移fromXValue **** 控件宽度个像素点,此时fromXValue为一个百分比值,表示偏移量相对控件自身宽度的百分比;
fromXType取值为Animation.RELATIVE_TO_PARENT 时,表示X轴方向的平移起点相对父控件平移fromXValue **** 父控件宽度个像素点,此时fromXValue为一个百分比值,表示偏移量相对父控件宽度的百分比;fromYType 和 fromYValue:分别表示平移起点Y轴方向的偏移类型和偏移量,具体含义同fromXType 和 fromXValue;
toXType 和 toXValue、toYType 和 toYValue:则表示终点位置的偏移量,具体含义同起点偏移量;
旋转动画属性:
public RotateAnimation(Context context, AttributeSet attrs)
public RotateAnimation(float fromDegrees, float toDegrees)
public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,
int pivotYType, float pivotYValue)
如上为RotateAnimation的四个构造方法,其目的均为了设置fromDegrees、toDegrees、pivotXType、pivotXValue、pivotYType、pivotYValue这几个属性值,下面对这几个属性分别进行介绍。
fromDegrees 和 toDegrees:这两个属性分别表示旋转起始角度和终止角度;
-
pivotXType、pivotXValue、pivotYType、pivotYValue:这四个属性用于设置旋转中心点位置。
pivotXType 和 pivotXValue分别表示旋转中心在X轴方向相对原点(即控件左上角)的偏移类型和偏移量,pivotXType有三个可选取值:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF 和 Animation.RELATIVE_TO_PARENT,分别表示绝对偏移、相对自身偏移和相对父控件偏移,当取Animation.ABSOLUTE时,pivotXValue是一个绝对数值,否则pivotXValue是一个相对数值(取值为1表示100%)。
pivotYType 和 pivotYValue:分别表示旋转中心在Y轴方向相对原点的偏移类型和偏移量,具体含义同pivotXType 和 pivotXValue。示例使用如下:
final RotateAnimation rotate2 = new RotateAnimation(0, 90, Animation.RELATIVE_TO_PARENT, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
// X轴坐标向右偏移0.5倍父控件宽度,Y轴坐标向下偏移0.5倍自身宽度,然后围绕该点向右旋转90度
- 缩放动画属性:
public ScaleAnimation(Context context, AttributeSet attrs)
public ScaleAnimation(float fromX, float toX, float fromY, float toY)
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
float pivotX, float pivotY)
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
如上为ScaleAnimation的四个构造函数,最终均为了设置ScaleAnimation的如下几个属性:
fromX、toX、fromY、 toY、pivotXType、pivotXValue、pivotYType 和 pivotYValue。
fromX 和 toX:这两个属性分别表示水平方向上相对自身的起始缩放因子和终止缩放因子,1表示100%,即原始大小,因此水平方向缩放的总长度为(toX-fromX) * width
fromY 和 toY:这两个属性分别表示垂直方向上相对自身的起始缩放因子和终止缩放因子
-
pivotXType、pivotXValue、pivotYType 和 pivotYValue:这四个属性用于控制缩放中心坐标点位置。具体含义参见旋转动画属性说明部分。
示例使用如下:
ScaleAnimation scale = new ScaleAnimation(1, 1.5f, 1, 1.5f, Animation.RELATIVE_TO_PARENT, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
// 表示以X坐标向右偏移0.5倍父控件宽度,Y坐标向下偏移0.5倍自身高度的点为缩放中心点
// 将控件的水平和垂直方向分别从当前宽高放大0.5倍
```
- 透明度动画属性:
public AlphaAnimation(Context context, AttributeSet attrs)
public AlphaAnimation(float fromAlpha, float toAlpha)
如上为AlphaAnimation的两个构造方法,主要看第二个构造方法中的两个属性fromAlpha 和 toAlpha,这两个属性分别表示动画开始时的透明度和结束时的透明度,0.0表示完全透明,即不可见,1.0表示完全不透明。
示例使用如下:
AlphaAnimation alpha = new AlphaAnimation(1, 0);
// 表示将控件从不透明状态调整到完全透明状态
- 动画集(AnimationSet)属性:
动画集用于将一组一起播放的动画组合为一个动画。动画集从父类Animation中继承的一些属性的作用方式需要认真加以理解,因为不同属性的表现方式各异,有些属性只作用于动画集自身,有些属性会作用于动画集中的子动画,而有些属性又会被忽略。- duration, repeatMode, fillBefore, fillAfter: 当为AnimationSet设置了这几个属性的时候,这几个属性将会作用于该动画集中的所有子动画中
- repeatCount, fillEnabled: 这两个属性在AnimationSet中不起作用,将会被忽略;
- startOffset, shareInterpolator: 这两个属性将作用于AnimationSet自身