一、动画分类及简介
View Animation 视图动画
Property Animation 属性动画
1.View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画);
Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;
Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。
2.Property Animation:属性动画,通过动态地改变对象的属性从而达到动画效果,属性动画为API 11新特性。
3.差别
View Animation仅能对指定的控件做动画,而Property Animator是通过改变控件某一属性值来做动画的。
补间动画虽能对控件做动画,但并没有改变控件内部的属性值(比如 位移后点击事件没有响应,因为补间动画将这个view重新绘制,而对应的属性位置还是没有改变)。而Property Animator则是恰恰相反,Property Animator是通过改变控件内部的属性值来达到动画效果的
二、View Animation 视图动画
1.逐帧动画: (帧动画使用很简单,但很容易出现OOM。尽量避免使用较大较多的图片。)
2.补间动画的四种变换
平移动画 <translate> TranslateAnimation 移动View
缩放动画 <scale> ScaleAnimation 放大或缩小View
旋转动画 <rotate> RotateAnimation 旋转View
透明度动画 <alpha> AlphaAnimation 改变View的透明度
<set> 标签标示动画集合,对应于AnimationSet类
3.其他
LayoutAnimation
LayoutAnimation作用于ViewGroup,更经常的是作用于ListView,使得每个子Item都具有此动画
定义
Activity的切换效果主要用到overridePendingTransition(int enterAnim, int exitAnim)
这个方法,需要注意的是,这个方法需要在startActivity(Intent intent)
或者finish()
之后被调用才能生效。
三、属性动画
原理:在规定的时间内,修改对象的属性(对象中对应的字段)的值,以此实现该对象在属性上的动画效果。
1.ValueAnimator
控制 值 的变化,之后 手动 赋值给对象的属性,从而实现动画
ValueAnimator.ofInt(int... values) -- 整型数值 内置IntEvaluator估值器
ValueAnimator.ofFloat(float... values) -- 浮点型数值 内置FloatEvaluator估值器
ValueAnimator.ofObject(TypeEvaluator evaluator, Object... values) -- 自定义对象类型 需要自定义TypeEvaluator
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {}
evaluator实现了 TypeEvaluator 接口,然后重写了 evaluate() 方法。该方法的三个参数意义如下:
fraction:表示动画完成度,据此计算当前动画的值
startValue:动画初始值
endValue:动画结束值
那么 evalute() 方法的返回值就是返回当前动画的值。
实例
//2. 在传入参数之间平滑过渡
//如下则0平滑过渡到3
ValueAnimator animator = ValueAnimator.ofInt(0,3);
//如下传入多个参数,效果则为0->5,5->3,3->10
//ValueAnimator animator = ValueAnimator.ofInt(0,5,3,10);
//设置动画的基础属性
animator.setDuration(5000);//播放时长
animator.setStartDelay(300);//延迟播放
animator.setRepeatCount(0);//重放次数
animator.setRepeatMode(ValueAnimator.RESTART);
//重放模式
//ValueAnimator.START:正序
//ValueAnimator.REVERSE:倒序
//设置更新监听
//值 改变一次,该方法就执行一次
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//获取改变后的值
int currentValue = (int) animation.getAnimatedValue();
//输出改变后的值
Log.d("onAnimationUpdate", "-----: " + currentValue);
//改变后的值发赋值给对象的属性值
view.setproperty(currentValue);
//刷新视图
view.requestLayout();
}
});
//启动动画
animator.start();
2.ObjectAnimator
ValueAnimator只是对 值 进行平滑的动画过渡;ObjectAnimator直接对 任意对象的任意属性 进行动画操作,如View的alpha属性
ValueAnimator需要我们为对象属性手动赋值;ObjectAnimator会为对象属性自动赋值
实例
ObjectAnimator animator = ObjectAnimator.ofFloat(Object object, String property, float ....values);
//ObjectAnimator animator = ObjectAnimator.ofInt(Object object, String property, int ....values);
//ObjectAnimator animator = ObjectAnimator.ofObject(Object object, String property, TypeEvaluator evaluator,Object....values);
// 以ofFloat为例 参数说明:
// Object object:需要操作的对象
// String property:需要操作的对象的属性
// float ....values:动画初始值 & 结束值(不固定长度)
// 若是两个参数a,b,则动画效果则是从属性的a值到b值
// 若是三个参数a,b,c,则则动画效果则是从属性的a值到b值再到c值
// 至于如何从初始值 过渡到 结束值,同样是由估值器决定,此处ObjectAnimator.ofFloat()是有系统内置的浮点型估值器FloatEvaluator,同ValueAnimator讲解
//动画基本属性
anim.setDuration(500);
anim.setStartDelay(500);
anim.setRepeatCount(0);
anim.setRepeatMode(ValueAnimator.RESTART);
animator.start();
// 启动动画
注意:ObjectAnimator内部的工作机制是去寻找这个属性名对应的get和set方法,通过二者赋值。ObjectAnimator 类针对的是任意对象 & 任意属性值,并不是单单针对于View对象
如果需要采用ObjectAnimator 类实现动画效果,那么需要操作的对象就必须有该属性的set() & get()
四、插值器与估值器
插值器(TimeInterpolator):它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearInterpolator、AccelerateDecelerateInterpolator、DecelerateIntepolator等
实例
Animation alphaAnimation = new AlphaAnimation(1,0);
// 步骤2:创建透明度动画的对象 & 设置动画效果
alphaAnimation.setDuration(3000);
Interpolator overshootInterpolator = new OvershootInterpolator();
// 步骤3:创建对应的插值器类对象
alphaAnimation.setInterpolator(overshootInterpolator);
// 步骤4:给动画设置插值器
mButton.startAnimation(alphaAnimation);
// 步骤5:播放动画
估值器(TypeEvaluator):它的作用是根据当前属性改变的百分比来计算改变后的属性值(插值器得出的值),系统预置的有IntEvaluator(针对整型属性)、FloatEvaluator(针对浮点型属性)和ArgbEvaluator(针对Color属性)
简单地说,TimeInterpolator实现类:插值器-描述动画的变化速率
TypeEvaluator实现类:估值器-描述 属性值 变化的具体数值
五、属性动画的监听
属性动画也提供了监听器用于监听动画的过程,如下所示:
public static interface AnimatorListener{
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);
}
此外,系统还提供了AnimatorListenerAdapter这个类,我们可以通过这个类来有选择的实现上面的接口方法,而不必实现所有的方法。
另外,还有一个AnimatorUpdateListener接口,如下所示:
public static interface AnimatorUpdateListener{
void onAnimationUpdate(ValueAnimator animation);
}
这个监听器会监听整个动画过程,每播放一帧,onAnimationUpdate()就会被调用一次。