Android 动画

来源:互联网 发布:怎么把淘宝店铺关闭 编辑:程序博客网 时间:2024/06/01 08:06

前言

Android动画方面一直是个难点,学了又忘,现在整理记录下来以便查阅。

逐帧动画(Frame Animation)

在Android中实现逐帧动画,就是由设计师给出一系列状态不断变化的图片,开发者可以指定动画中每一帧对应的图片和持续的时间,然后就可以开始播放动画了。具体而言,有两种方式可以定义逐帧动画,分别采用XML资源文件和代码实现。

  • XML资源文件方式
    这是最常使用的方式,首先我们将每一帧图片放到res/drawable目录中,然后在res/anim目录中新建一个动画XML文件,在这个文件中使用标签来定义动画帧序列,使用标签来定义动画的每一帧,并在其中指定帧的持续时间等属性,格式如下。
<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"   android:oneshot="false">    <item               android:drawable="@drawable/common_loading_01"        android:duration="120" />    <item       android:drawable="@drawable/common_loading_02"       android:duration="120"/>    <item             android:drawable="@drawable/common_loading_03"       android:duration="120"/>       ...............  </animation-list>            

其中android.onshot用来控制动画是否循环播放,如果取值为true,表示动画不会循环播放,否则动画将会循环播放;android:duration用来指定每一帧的播放持续时间。

  • 代码方式
    在代码中定义逐帧动画也很简单,但不常用,语句如下。
 AnimationDrawable animDrawable = new AnimationDrawable(); for(int i=1;i<5;i++){   int id=getResources()         .getIdentifier("common_loading_"+i,"drawable",getPackageName());   Drawable drawable = getResources().getDrawable(id);   animDrawable.addFrame(drawable,120);}imageView.setBackgroundDrawable(animDrawable);animDrawable.setOneShot(false);

定义好逐帧动画之后,可以在符合某个条件是触发或者停止动画的播放,伪代码:

//获取AnimationDrawable对象实例,用来控制动画的播放和停止AnimationDrawable animDrawable = (AnimationDrawable)imageView.getBackground();//动画的播放animDrawable.start();//动画的停止animDrawable.stop();

补间动画(Tween Animation)

补间动画是指开发者无须定义动画过程中的每一帧,只需要定义动画的开发和结束这两个关键帧,并指定动画变化的时间和方式等,然后交由Android系统进行计算,通过在两个关键帧之间插入渐变值来实现平滑过渡,从而对View的内容完成一系列的图形变化来实现的动画效果,主要包括四种基本的效果:透明度变化Alpha、大小变化Scale、位移变化Translate及旋转变化Rotate,这四种效果可以动态组合,从而实现复杂灵活的动画。同样,定义补间动画也可以分为XML资源文件和代码两种方式。不过在这之前,我们首先来认识一下插值器Interpolator。

  • 插值器Interpolator
    前面说到的Android系统会在补间动画的开始和结束关键帧之间插入渐变值,它依据的便是Interpolator。具体来说,Interpolator会根据类型的不同,选择不同的算法计算出在补间动画期间所需要动态插入帧的密度和位置,Interpolator负责控制动画的变化速度,使得前面所说的四种基本动画效果能够以匀速、加速、减速、抛物线等多种速度进行变化。
    具体到Android代码中,Interpolator类其实是一个空接口,它继承自TimeInterpolator,TimeInterpolator时间插值器允许动画进行非线性运动变换,如加速和减速等,该接口中只有float getInterpolation(float input)这个方法。入参是一个0.0~1.0的值,返回值可以小于0.0也可以大于1.0,代码如下。
public interface Interpolator extends TimeInterpolator{     public interface TimeInterpolator{     float getInterpolation(float input);   }}

Android提供了几个Interpolator的实现类,如下

  • AccelerateDecelerateInterpolator:在动画开始与结束的时候速率改变比较慢,在中间的时候加速。
  • AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后加速。
  • AnticipateInterpolator:动画开始的时候先向后,然后向前滑动
  • AnticipateOvershootInterpolator:动画开始的时候先向后,然后向前甩一定值后返回最后的值。
  • BounceInterpolator:动画结束的时候弹起。
  • CycleInterpolator:动画循环播放特定的次数,速率的改变遵循正弦曲线。
  • DecelerateInterpolator:在动画开始的地方速率改变比较快,然后开始变慢
  • LinearInterpolator:动画已常量速率进行改变。
  • OvershootInterpolator:动画向前甩一定值后再回到原来位置。
  • PathInterpolator:新增的,通过定义路径坐标,动画可以按照路径坐标来运行;注意这里的坐标并不是值十字坐标系,而是单方向,也就是可以从0~1,然后弹回0.6后再弹到0.8,知道最后时间结束。

    补间动画的四种基本类型

  • AlphaAnimation :改变透明度的动画,创建动画时需要指定动画开始和结束的透明度,以及动画的持续时间,透明度的取值范围是0~1。
  • ScaleAnimation:缩放大小的动画,创建动画时需要指定动画开始和结束时在X轴和Y轴的缩放比,以及动画持续时间;同时由于缩放时以不同的点作为中心会产生不同的效果,因此也需要通过pivotX和pivotY指定缩放中心的坐标。
  • TranslateAnimation:改变位置的动画,创建动画时需要指定动画开始和结束时的X,Y坐标,以及动画的持续时间。
  • RotateAnimation:旋转动画,创建动画时需要指定动画开始和结束时的旋转角度,以及动画持续时间;同时由于旋转时以不同的点作为中心会产生不同的效果,因此也需要通过pivotX和pivotY指定旋转中心图标。
原创粉丝点击