动画深入研究

前言

分类

View动画,帧动画,自定义View动画,属性动画

View动画

平移,缩放,旋转,透明
TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation
注意的概念有interpolator插值器(控制动画执行速率),轴点,fillAfter动画完成后是否停留在结束位置.
XML与代码中定义动画,让控件执行动画,通过setAnimationListener给View动画添加过程监听。
xml定义的使用Animation animation = AnimationUtils.loadAnimation(context, R.anima.xxx);
mButton.startAnimatioin(animation)
代码定义直接new AlphaAnimation(0,1);
再设置属性完成动画效果控制。

帧动画

通过AnimationDrawable来使用帧动画,将Drawable作为View的背景来播放动画。
避免使用较大的图来做动画的帧造成OOM

自定义View动画

继承Animation抽象类,重写initialize和applyTransformation方法。
基本原理是利用数学的矩阵变换.应用场景少,遇到再深究

View动画的特殊使用场景

不同Activity之间的切换效果

在startActivity(Intent)或finish()后使用overridePendingTransition(int, int)可以设置Activity的切换动画。且必须在这两方法后使用。

Fragment也可以设置切换动画。通过FragmentTransaction中的setCustomAnimations()设置动画。且只能是View动画。Api不支持属性动画。Activity支持但是使用就黑屏,这个需要去探究原因。

实验Fragment的时候连Fragment怎么调都忘记了,记得面试遇到过文它与Activity的区别。但是用得实在少,加上这段时间这弄php,产品,项目管理,linux运维这类的事情。Android手生了。"鸿洋Fragment完全解析上"

系统提供了一些内置动画,如:android.R.anim.fade_in

LayoutAnimation布局子元素出场效果

LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果。
在ListView或者RecyclerView的时候效果不明显,因为View是复用的。

属性动画基础

属性动画根据时间变化来改变对象的属性来实现绚丽的动画。比View动画更加灵活,适用性更加广泛,不局限于动画。对象的属性,或者某些值根据时间变化而变化的都可以应用。

分为ValueAnimator、ObjectAnimator、AnimatorSet。ObjectAnimator继承自ValueAnimator。AnimatorSet是动画集合。ObjectAnimator比ValueAnimator新增能够对对象进行操作。

用XML定义对应的标签是animator,objectAnimator,set.定义在res下的animator目录。

要注意的属性
set:
ordering有两个可选值:"together"和"sequentially",表示"同时播放"和"顺序播放"。

objectAnimator:
propertyName,表示属性名称,只有objectAnimator有。animator是没有的。
repeatCount,表示动画重复次数,-1表示无限循环。
repeatMode,表示动画的重复模式。"restart"和"reverse",表示"连续重复"和"逆向重复"。
valueType,表示propertyName所指定属性的类型,有"intType"与"floatType".
如果属性表示的是颜色,不需要指定valueType,系统会自动对颜色类型的属性做处理。

使用XML动画:

AnimatorSet set = (AnimatorSet)AnimatorInflater.loadAnimator(myContext, R.animator.property_animator);
set.setTarget(mButton);
set.start();

使用代码比XMl要简单,如:

ObjectAnimator.ofFloat(myObject, "translationY", -myObject.getHeight()。

插值器(Interpolator)与类型估值算法(TypeEvaluator)

插值器是根据时间的流逝,在动画持续时间内,计算出目标值改变的百分比。
常见的有:时间插值器(TimeInterpolator),线性插值器(LinearInterpolator),减速插值器(Decelerate-Interpolator),加速减速插值器(AcclerateDecelerateInterpolator)
估值器是根据目标值改变的百分比与内部的估值算法计算出某时间点的目标值。
系统预置的有:IntEvaluator与FloatEvaluator和ArgbEvaluator(针对颜色值)。
除这3种外,要对其他类型做动画,那么必须自定义估值算法。继承TypeEvaluator.
可自定义插值器与估值算法完成自定义的属性动画。

监听器(AnimatorListener与AnimatorUpdateListener接口)

AnimatorLister接口有四个方法:
1.onAnimationStart(Animator animator)
2.onAnimationEnd(Animator animator)
3.onAnimationCancel(Animator animator)
4.onAnimationRepeat(Animator animator)

AnimatorUpdateListener接口只有一个方法onAnimationUpdate.它在动画每个帧播放的时候就会被调用一次。

属性动画的工作原理

(1)属性的set必须有,get方法如果没提供初值也必须有,否则Crash。属性动画会在用到的时候利用反射机制调用。
(2)对属性做的改变如果不体现在UI上是没有动画效果,但是属性值已经改变。
(3)如果对象的set与get方法不是操作我们理性的属性值,可以通过以下三个途径解决:
1.给你的对象加上get与set方法,如果你有权限的话。
2.用一个类来包装原始对象,间接为其提供get与set方法;
3.采用ValueAnimator,监听动画过程,自己实现属性的改变。

属性动画必须运行在有Looper的线程。不一定是要主线程吗?

使用动画的注意事项

1.帧动画的OOM
2.内存泄露,无限循环的动画,要在Activity退出时停止,最好是onPause就停止。否则会导致Activity无法释放内存。有人验证过,View动画并不存在此问题。
3.View动画可能会造成完成动画后View的Gone失效。需要调用view.clearAnimation()清除View动画。
4.尽量使用dp而不是px
5.View动画注意fillerAfter设置是否停留在动画完成的位置,触发单机事件是否有效等问题。
6.使用动画,建议开启硬件加速

你可能感兴趣的:(动画深入研究)