1.Android View动画框架
Animation 框架定义了透明度、旋转、缩放和位移几种常见的动画,而且控制的是整个View。
实现原理
每次绘制视图时 View 所在的 Vie wGroup 中的 drawChild 函数获取该 View 的 Animation 的 Transformation 值,然后调canvas.concat(transform ToApply.getMatrix()) , 通过矩阵运符完成动画帧。如帧动画没有完成,就继续调invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。
优点
- 视图动画使用简单,效果丰富,它提供了AlphaAnimation、RotateAnimation、TranslateAnimation、ScalcAnimation 四种动画方式,并提供了 AnimationSet 动画合集,混合使用多种动画,在Android 3.0 之前,视图动画一家独大。
- 效率比较高且使用方便,可以通过 XML 文件来描述一个动画过程,同样也可以使用代码控制整个动画过程。
缺点
- 不具备交互性。当某个元素发生视图动画后,其响应事件的位置还依然在动画前的地方,所以视图动画只能做普通的动画效果,避免交且的发生。
以下举出一些简单的视图动画使用方法。
在这里给出仓库地址。
gitHub仓库地址1.1 透明度动画
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(1000);
sevenBinding.ivDemo.startAnimation(aa);
1.2 旋转动画
RotateAnimation ra = new RotateAnimation(0, 360,
RotateAnimation.RELATIVE_TO_SELF, 1f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
ra.setDuration(1000);
sevenBinding.ivDemo.startAnimation(ra);
1.3 缩放动画
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);
sa.setDuration(2000);
sevenBinding.ivDemo.startAnimation(sa);
1.4 平移动画
TranslateAnimation ta = new TranslateAnimation(
TranslateAnimation.RELATIVE_TO_SELF,0f,
TranslateAnimation.RELATIVE_TO_SELF,0f,
TranslateAnimation.RELATIVE_TO_SELF,0f,
TranslateAnimation.RELATIVE_TO_SELF, 1f);
ta.setDuration(2000);
sevenBinding.ivDemo.startAnimation(ta);
1.5 动画集合
将以上几种动画组合起来,就成了动画集合
AnimationSet as = new AnimationSet(true);
as.setDuration(2000);
as.addAnimation(aa);
as.addAnimation(ra);
as.addAnimation(sa);
as.addAnimation(ta);
sevenBinding.ivDemo.startAnimation(as);
2. Android属性动画分析
由于Android3.0之前已有的动画框架Animation存在局限性,动画的改变只是显示,并不能响应事件。所以Android 在3.0之后推出属性动画这个新的动画框架。而在Animation框架中使用最多的就是AnimatorSet和ObjectAnimator配合使用。
大致过程就是ObjectAnimator进行更加细化的控制,只控制一个对象的一个属性值,而使用ObjectAnimator组合到AnimatorSet形成一个动画。
2.1.ObjectAnimator
特点
ObjectAnimator能够自动驱动,可以调用setFrameDelay(longframeDelay)设置动画帧之间的间隙时间,调整频率,减少动画过程中频繁绘制界面,而在不影响动画效果的前提下减少CPU资源消耗。更重要的是,属性动画通过调用属性get、set方法来真实的控制了一个View的属性值。基本可以实现所有的动画效果。
以下是是伪代码
gitHub仓库地址
//属性动画ObjectAnimator
ObjectAnimator oa = ObjectAnimator.ofFloat(sevenBinding.ivDemo, "translationX", 400);
oa.setDuration(1000);
oa.start();
过程分析
通过ObjectAnimator的静态工厂类,返回一个ObjectAnimator对象。参数包括一个对象和一个对象属性的名字,但这个属性必须有get和set函数,内部会通过java反射机制来动用set函数修改对象的属性值。
使用以前动画框架所产生的动画,并不能改变事件响应的位置,它只是单纯修改了显示。动画结束后,原来的图片实际位置还是起始位置。
但是属性动画则真实地改变了一个View的属性,所以位置也会发生变化。
通过ObjectAnimator的静态工厂方法,创建一个ObjectAnimator对象。
- 第一个参数,需要操纵的view
- 第二个参数,需要操纵的属性
- 第三个参数,可变数组参数,需要穿传进去该属性变化的一个取值过程。,这里只设置了一个参数。
在使用ObjectAnimtor的时候,操纵的属性必须具有get和set
属性,不然ObjectAnimator就无法起效。以下是可以直接使用属性动画的属性值。
- translationX和 translationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标偏移的位置。
- rotation、rotationX和rotationY:这三个属性控制着VIew对象围绕支点进行2D和3D旋转
- scaleX和scaleY:控制View对象绕它的支点进行2D缩放