《Android群英转-第七章》-Android动画机制与使用技巧

mac2024-01-31  42

学完本章,你将了解一下内容 Android视图动画、属性动画、动画实例

1.Android View动画框架

Animation 框架定义了透明度、旋转、缩放和位移几种常见的动画,而且控制的是整个View。

实现原理

每次绘制视图时 View 所在的 Vie wGroup 中的 drawChild 函数获取该 View 的 Animation 的 Transformation 值,然后调canvas.concat(transform ToApply.getMatrix()) , 通过矩阵运符完成动画帧。如帧动画没有完成,就继续调invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。

优点

视图动画使用简单,效果丰富,它提供了AlphaAnimation、RotateAnimation、TranslateAni­mation、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缩放
最新回复(0)