android 几种动画介绍

来源:互联网 发布:c语言论坛 编辑:程序博客网 时间:2024/05/22 22:29

概述

在Android开发的过程中,View的变化是很常见的,如果View变化的过程没有动画来过渡而是瞬间完成,会让用户感觉很不友好,因此学习好Android系统中的动画框架是很重要的。

Android系统提供了两个动画框架:属性动画框架和View动画框架。 两个动画框架都是可行的选项,但是属性动画框架通常是首选的使用方法,因为它更灵活,并提供更多的功能。除了这两个框架,还可以使用Drawable动画(即逐帧动画,AnimationDrawable),它允许你加载Drawable资源并逐帧地显示它们。

1> View动画框架

View动画框架是旧的框架,只能用于Views。 比较容易设置和能满足许多应用程序的需要。View动画框架中一共提供了AlphaAnimation(透明度动画)、RotateAnimation(旋转动画)、ScaleAnimation(缩放动画)、TranslateAnimation(平移动画)四种类型的补间动画;并且View动画框架还提供了动画集合类(AnimationSet),通过动画集合类(AnimationSet)可以将多个补间动画以组合的形式显示出来。

2> 属性动画框架

与属性动画相比View动画存在一个缺陷,View动画改变的只是View的显示,而没有改变View的响应区域,并且View动画只能对View做四种类型的补间动画。因此Google在Android3.0(API级别11)及其后续版本中添加了属性动画框架,从名称中就可以知道只要某个类具有属性(即该类含有某个字段的set和get方法),那么属性动画框架就可以对该类的对象进行动画操作(其实就是通过反射技术来获取和执行属性的get,set方法),同样属性动画框架还提供了动画集合类(AnimatorSet),通过动画集合类(AnimatorSet)可以将多个属性动画以组合的形式显示出来。

 

3> Drawable 动画

可绘制动画通过一个接一个地加载一系列Drawable资源来创建动画。 这是一个传统的动画,它是用一系列不同的图像创建的,按顺序播放,就像一卷电影

 

时间插值器

对于补间动画:时间插值器(TimeInterpolator)的作用是根据时间流逝的百分比计算出动画进度的百分比。有了动画进度的百分比,就可以很容易的计算出动画开始的关键帧与将要显示的帧之间的差异(通过Transformation类的对象表示)

 

类型估值器

类型估值器(TypeEvaluator)是针对于属性动画框架的,对于View动画框架是不需要类型估值器(TypeEvaluator)的。
类型估值器(TypeEvaluator)的作用是根据属性值改变的百分比计算出改变后的属性值。由于属性动画实际上作用的是对象的属性,而属性的类型是不同的,因此Android内置了一些常用的类型估值器来操作不同类型的属性

 

View动画框架

使用View动画框架可以在Views上执行补间动画。补间动画是指只要指定动画的开始、动画结束的"关键帧",而动画变化的"中间帧"由系统计算并补齐;无论动画怎样改变View的显示区域(移动或者改变大小),持有该动画的View的边界不会自动调整来适应View的显示区域,即使如此,该动画仍将被绘制在超出其视图边界并且不会被剪裁,但是,如果动画超过父视图的边界,则会出现裁剪。在Android中的View动画框架中一共提供了AlphaAnimation(透明度动画)、RotateAnimation(旋转动画)、ScaleAnimation(缩放动画)、TranslateAnimation(平移动画)四种类型的补间动画。

 

 

补间动画(Tween animation)两个常用的特殊场景

1 通过布局动画(LayoutAnimation)给ViewGroup的子View指定入场动画。

首先通过xml定义ViewGroup的子View入场动画

接着为ListView设置布局动画(LayoutAnimation)

 

上面是通过java代码来为ListView设置布局动画(LayoutAnimation)的,其实通过xml也可以为ListView设置布局动画(LayoutAnimation)

 

2 通过补间动画(Tween animation)为Activity自定义切换动画
Android
系统为Activity设置了默认的切换动画,这个动画我们是可以进行自定义的。通过调用Activity类的overridePendingTransition(intenterAnim, int exitAnim)方法可以实现自定义Activity的切换动画,注意这个方法必须在startActivity和finish调用之后被调用,否者没有效果。

 

Drawable动画(逐帧动画)

逐帧动画是用来逐帧显示预先定义好的一组图片,类似于电影播放。对应于AnimationDrawable类。

 

属性动画框架

与属性动画相比View动画存在一个缺陷,View动画改变的只是View的显示,而没有改变View的响应区域,并且View动画只能对View做四种类型的补间动画,因此Google在Android3.0及其后续版本中添加了属性动画框架。同样属性动画框架还提供了动画集合类(AnimatorSet),通过动画集合类(AnimatorSet)可以将多个属性动画以组合的形式显示出来。

 

下面是我关于属性动画框架工作原理的总结:

顾名思义只要某个类具有属性(即该类含有某个字段的setget方法),那么属性动画框架就可以对该类的对象进行动画操作(其实就是通过反射技术来获取和执行属性的getset方法),因此属性动画框架可以实现View动画框架的所有动画效果并且还能实现View动画框架无法实现的动画效果。属性动画框架工作原理可以总结为如下三步:
1
在创建属性动画时如果没有设置属性的初始值,此时Android系统就会通过该属性的get方法获取初始值,所以在没有设置属性的初始值时,必须提供该属性的get方法,否者程序会Crash。

2 在动画播放的过程中,属性动画框架会利用时间流逝的百分比获取属性值改变的百分比(即通过时间插值器),接着利用获取的属性值改变的百分比获取改变后的属性值(即通过类型估值器)。

3 通过该属性的set方法将改变后的属性值设置到对象中。

 

还要注意一点,虽然通过set方法改变了对象的属性值,但是还要将这种改变用动画的形式表现出来,否者就不会有动画效果,所以属性动画框架本身只是不断的改变对象的属性值并没有实现动画效果。

 

<set>对应AnimatorSet(属性动画集合)类,<objectAnimator>对应ObjectAnimator类,<animator>标签对应ValueAnimator类;并且属性动画集合还可以包含属性动画集合。

 

其实ValueAnimator类就是一个数值生成器,也就是没有上面关于属性动画框架工作原理的第1步和第3,ObjectAnimator作为ValueAnimator的子类,实现了这两步。你只要给ValueAnimator提供一个初始值、结束值和周期时间,ValueAnimator就会按照属性动画框架工作原理的第2中的步骤生成具有一定规则的数字。

过渡动画

Android Transition Framwork 主要用来做三件事

1,Activity间的转场动画;

2,不同Activity或Fragment间元素共享,让交互更连贯;

3,同一个Activity之间一些View的变换动画。

 

进入退出

当从ActivityA切换到ActivityB时我们可以跟以前一样分别定义A的退出动画和B的进入动画,5.0之后android.transition.Transition提供给我们三个可以直接使用的transition:Explode,Slide,Fade.

1,而你需要做的,首先对Activity的ThemeStyle添加windowContentTransitions属性:

2用startActivity(mIntent,ActivityOptions.makeSceneTransitionAnimation(this)

.toBundle());来替换之前的startActivity();

 

让我们来分析以下具体发生了什么:

首先ActivityA启动了ActivityB;

TransitionFramework找到A的退出动画(Slide)并且应用;

TransitionFramework找到B的进入动画(Explode)并且应用;

返回事件被触发后,Transition Framework执行进入动画和退出动画的逆向过程(但是如果我们定义了returnTransition和reenterTransition动画,返回效果将会按照我们定义的动画执行)。

 

元素共享

1.首先我们需要做的仍然是去定义Themeandroid:windowContentTransitionstrue
2.
然后对不同activityfragment的共享的view元素设置统一的android:transitionName

3.使用ActivityOptions.makeSceneTransitionAnimation()来定义共享的viewtransitionName

 

Scene

Transition Framework 核心就是根据Scene (场景,下文解释)的不同帮助开发者们自动生成动画。通常主要是通过以下几个方法开启动画。

TransitionManager.go()

beginDelayedTransition()

setEnterTransition()/setSharedElementEnterTransition()