第七章 Android动画深入分析
View动画通过对场景里的对象不断做图像变换(平移、缩放、旋转、透明度)从而产生动画效果,他是一种渐进式动画。可自定义。
帧动画通过顺序播放一系列图像从而产生动画效果,图片过多过大会导致OOM。
属性动画通过动态改变对象的属性从而达到动画效果。
7.1 View动画
作用对象是View,支持4中动画效果:平移、缩放、旋转、透明度。
7.1.1 View动画的种类
View动画的4中变换效果对应Animation的4个子类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation。
可通过XML(res/anim/XXX.xml)定义或者代码动态创建。
标签标示动画集合,对应AnimationSet类,可以包含若干个动画,并且内部也可以嵌套其他动画集合。
android:interpolator 插值器,影响动画的速度,默认为@android:anim/acclerate_decelerate_interpolator,即加速减速插值器
android:shareInterpolator 表示集合中的动画是否和集合共享同一个插值器。如果集合不指定插值器,那么自动化就需要单独制定所需的插值器或者使用默认值
标签标示平移动画,对应TranslateAnimation类。
android:fromXDelta x起始值
android:toXDelta x结束值
android:fromYDelta y起始值
android:toYDelta y结束值
标签标示缩放动画,定义ScaleAnimation
android:fromXScale 水平缩放起始值,如0.5
android:toXScale 水平缩放结束值,如1.2
android:fromYScale 竖直缩放起始值
android:toYScale 竖直缩放结束值
android:pivotX 缩放的轴点的x坐标
android:pivotY 缩放的轴点的y坐标
轴点:默认为View的中心点,此时水平方向缩放会导致View想左右两个方向同时进行缩放,如果轴点设置为View的右边界,那么缩放只会向左进行,反之同理。
-
android:fromDegrees 开始角度,如0
android:toDegrees 结束角度,如180
android:pivotX 缩放的轴点的x坐标
android:pivotY 缩放的轴点的y坐标
-
android:fromAlpha 开始值,如0.1
android:toAlpha 结束值,如1
其他View动画常用属性
android:duration 动画持续时间 android:fillAfter 动画结束后是否停留在结束为止,true or false
应用xml
Animation animation = AnimationUtils.loadAnimation(this, R.anim.XXX);
mView.startAnimation(animation);代码动态添加动画
AlphaAnimation alphaAnim = new AlphaAnimation(0, 1);
alphaAnim.setDuration(300);
mView.startAnimation(alphaAnim);可以通过setAnimationListener添加动画过程的监听器
7.1.2 自定义View动画
继承Animation抽象类
重写initialize(做一些初始化工作)和applyTransformation(进行相应的矩阵变换,很多时候需采用Camera来简化矩阵变换过程)方法。
7.1.3 帧动画
使用AnimationDrawable来使用帧动画
通过XML定义一个AnimationDrawable (res/drawable/XXX.xml)
7.2 View动画的特殊使用场景
特殊场景:在ViewGroup中控制子元素的出场效果,在Activity中实现不同Activity之前的切换效果。
7.2.1 LayoutAnimation
LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,这样当他的子元素出场时都会具有这种动画效果。常用于ListView。
1) 路径:/res/anim/xxx.xml
2) android:delay 开始动画的延迟时间
3) android:animationOrder 子元素动画的顺序,normal(顺序)、reverse(反序)、random(随机)
4) android:animation 子元素的入场动画
为ViewGroup指定android:layoutAnimation=”@anim/xxx”
除了在xml中指定LayoutAnimation,还可以通过LayoutAnimationController用代码动态实现。
7.2.2 Activity切换效果
对应方法:overridePendingTransition(int enterAnim, int exitAnim),需在startActivity或者finish之后调用才能生效。
7.3 属性动画
与View动画不同,属性动画可以对任何对象做动画。有ValueAnimator、ObjectAnimator、AnimatiorSet等概念。
7.3.1 使用属性动画
改变一个对象(myObject)的translationY属性
ObjectAnimator.ofFloat(myObject, “translationY”, -myObject.getHeight()).start();
改变一个对象的背景色属性 backgroundColor
动画集合,对View进行旋转、平移、缩放、透明度改变