Android动画--属性动画--基础

来源:互联网 发布:阿里云盘免费吗 编辑:程序博客网 时间:2024/05/18 03:04

动画,自己一直觉得挺难的,其实心里一直觉得越是酷炫的效果就会越难,所以自己也没想过去涉足,今天算是自己正式进入动画世界吧……

在此依然是感谢前辈们,没有前辈们的辛苦挖坑种树,哪还有我们的乘凉地!

3.0之前已有的动画框架–了解

逐帧动画(frame-by-frame animation)和补间动画(tweened animation)。

Frame Animation(逐帧动画)的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理。

Tween Animation(补间动画)是对某个View进行一系列的动画的操作,包括淡入淡出(Alpha),缩放(Scale),平移(Translate),旋转(Rotate)四种模式.

1:Tween Animation(补间动画)只是针对于View,超脱了View就无法操作了,这句话的意思是:假如我们需要对一个Button,ImageView,LinearLayout或者是其他的继承自View的各种组件进行动画的操作时,Tween Animation是可以帮我们完成我们需要完成的功能的,但是如果我们需要用到对一个非View的对象进行动画操作的话,那么补间动画就没办法实现了。举个例子:比如我们有一个自定义的View,在这个View中有一个Point对象用于管理坐标,然后在onDraw()方法中的坐标就是根据该Pointde坐标值进行绘制的。也就是说,如果我们可以对Point对象进行动画操作,那么整个自定义的View,那么整个自继承View的当前类就都有了动画,但是我们的目的是不想让View有动画,只是对动画中的Point坐标产生动画,这样补间动画就不能满足了。

2:Tween Animation动画有四种动画操作(移动,缩放,旋转,淡入淡出),但是我们现在有个需求就是将当前View的背景色进行改变呢?抱歉Tween Animation是不能帮助我们实现的。

3:Tween Animation动画只是改变View的显示效果而已,但是不会真正的去改变View的属性,举个例子:我们现在屏幕的顶部有一个小球,然后通过补间动画让他移动到右下角,然后我们给这个小球添加了点击事件,希望位置移动到右下角的时候点击小球能的放大小球。但是点击事件是绝对不会触发的,原因是补间动画只是将该小球绘制到了屏幕的右下角,实际这个小球还是停在屏幕的顶部,所以你在右下角点击是没有任何反应的。

Android 3.0版本开始推出新的动画框架

Google在Androi3.0的时候推出了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。因为属性动画框架操作的是真实的属性值,直接变化了对象的属性,因此可以很灵活的实现各种效果,而不局限于以前的4种动画效果。即:不止可以应用于View,还可以应用于任何对象,Property Animation只是表示一个值在一段时间内的改变,当值改变时要做什么事情完全是你自己决定的。

属性动画的相关属性

这些都还不用仔细研究,下面有具体的代码、详细的注释和效果图,那样更容易理解和记忆。在“混合使用–重点”部分

属性名 属性的含义 Duration 动画的持续时间,默认300ms。 TimeInterPolation 时间差值,定义动画的变化率,如先快后慢。 Repeat count and behavior 重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。如播放3次,5次,无限循环,者是播放完时再反向播放。 Animator sets 动画集合,你可以定义一组动画,一起执行或者顺序执行。 Frame refresh delay 帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。

相关的类

ObjectAnimator 继承自 ValueAnimator,ValueAnimator继承自Animator

类名 类的含义 ValueAnimator 动画的执行类,后面详细介绍 ObjectAnimator 动画的执行类,后面详细介绍 AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。 AnimatorInflater 用户加载属性动画的xml文件 TypeEvaluator 类型估值,主要用于设置动画操作属性的值。 TimeInterpolator 时间插值,上面已经介绍。

ValueAnimator

ValueAnimator是整个属性动画机制当中最核心的一个类,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等.

ObjectAnimator

继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的

      /**         *  第一个参数要求传入一个object对象,我们想要对哪个对象进行动画操作就传入什么,这里我传入了一个textview。         *  第二个参数是想要对该对象的哪个属性进行动画操作,由于我们想要改变TextView的不透明度,因此这里传入"alpha"。         *  后面的参数就是不固定长度了,想要完成什么样的动画就传入什么值,这里传入的值就表示将TextView从常规变换成全透明,再从全透明变换成常规。         *  之后调用setDuration()方法来设置动画的时长,         *  然后调用start()方法启动动画         */        //淡入淡出:从常规变换成全透明,再从全透明变换成常规//        ObjectAnimator animator = ObjectAnimator.ofFloat(imageview, "alpha", 1f, 0f, 1f);        //旋转:以中心为原点,旋转360度//        ObjectAnimator animator = ObjectAnimator.ofFloat(imageview, "rotation", 0f, 360f);        //平移:第四个参数为负时,将TextView先向左移出屏幕,然后再从左移动回来,为正数,向右移// float curTranslationX = textview.getTranslationX();// ObjectAnimator animator = ObjectAnimator.ofFloat(imageview, "translationX", curTranslationX, -500f, curTranslationX);// float curTranslationX =  textview.getTranslationY();// ObjectAnimator animator = ObjectAnimator.ofFloat(imageview, "translationX", curTranslationX, 500f, curTranslationX);        //缩放:TextView进行缩放操作,比如说将TextView在垂直方向上放大3倍再还原(垂直拉伸)        ObjectAnimator animator = ObjectAnimator.ofFloat(imageview, "scaleY", 1f, 3f, 1f);        animator.setDuration(5000);        animator.start();

混合使用–重点

独立的动画能够实现的视觉效果毕竟是相当有限的,因此将多个动画组合到一起播放就显得尤为重要。
实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

方法 方法含义 after(Animator anim) 将现有动画插入到传入的动画之后执行 after(long delay) 将现有动画延迟指定毫秒后执行 before(Animator anim) 将现有动画插入到传入的动画之前执行 with(Animator anim) 将现有动画和传入的动画同时执行
 ObjectAnimator moveIn = ObjectAnimator.ofFloat(imageview, "translationX",0f, -500f, 0f);//平移 ObjectAnimator rotate = ObjectAnimator.ofFloat(imageview, "rotation", 0f, 360f);//旋转 ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(imageview, "alpha", 1f, 0f, 1f);//淡入淡出 ObjectAnimator scale = ObjectAnimator.ofFloat(imageview, "scaleY", 1f, 3f, 1f);//缩放 //动画组合,使用AnimatorSet类中的play()方法,AnimatorSet animSet = new AnimatorSet();animSet.play(rotate).with(fadeInOut).with(scale).after(moveIn);//向左移出再从左边移回来后,然后旋转的同时并淡出淡入animSet.setDuration(5000);animSet.start();

效果图–gif要在2M以内
这里写图片描述

监听动画

.addListener(new Animator.AnimatorListener() {重写全部方法;
.addListener(new AnimatorListenerAdapter() {重写指定的方法;
这里写图片描述

0 0
原创粉丝点击