Android UIAndroid知识Android开发

Android动画

2017-03-25  本文已影响91人  程序员丶星霖

Android动画

Android提供了多种强大的API,用于动画UI元素和绘制自定义2D和3D图形。

逐帧动画(Frame)

这个动画相对容易理解,它要求我们把动画过程的每张静态图片都收集起来,然后由Android来控制依次显示这些静态图片,再利用人眼“视觉暂留”的原理,给人们造成动画的错觉。

定义逐帧动画非常简单,只需要在<animation-list.../>元素中使用<item.../>子元素定义动画的全部帧,并指定各帧的持续时间即可。定义逐帧动画的格式如下所示:

<?xml  version="1.0"  encoding="utf-8">
<animation-list  xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true"|"false"]>
    <item  android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer"/>
</animation-list>

上面的android:oneshot控制动画是否循环播放,如果设为true,则动画不会循环播放;否则动画将会循环播放。
需要注意的是,AnimationDrawable代表的动画默认是不播放的,必须在程序中启动动画播放才可以。AnimationDrawable提供了如下两个方法来开始、停止动画:

补间动画(Tween)

补间动画就是指我们只需要指定动画开始、结束等“关键帧”,动画变化的“中间帧”由系统计算并补齐。

Android使用Animation代表抽象的动画类,它包括了下面的几个子类:

Android为Interpolator提供了下面几个实现类,用于实现不同的动画变化速度:

为了在动画资源文件中指定补间动画所使用的的Interpolator,定义补间动画的<set.../>元素支持一个android:interpolator属性,这属性值可指定为Android默认支持的Interpolator。

自定义补间动画

Android提供了Animation作为补间动画抽象基类,并且为该抽象基类提供了AlphaAnimation、RotateAnimation、ScaleAnimation、TranslateAnimation四个实现类。

自定义补间动画时需要继承Animation,继承Animation时关键是要重写该抽象基类的applyTransformation(float interpolatedTime, Transformation t)方法,这个方法中的两个参数分别代表:

Transformation代表了对图片或视图的变形程度,这个对象中封装了一个Matrix对象,对它所包装的Matrix进行位移、倾斜、旋转等变换时,Transformation将会控制对应的图片或视图进行相应的变换。

为了控制图片或视图进行三维空间的变换,需要借助于Android提供的一个Camera(空间变换工具),它提供了下面的一些方法:

属性动画

从某种角度来看,属性动画是增强版的补间动画可以体现在如下方面:

与补间动画相似,属性动画也需要定义如下属性:

属性动画涉及的API如下:

属性动画还需要利用一个Evaluator(计算器),该工具类控制属性动画如何计算属性值。Android提供了如下的Evaluator:

1.使用ValueAnimator创建动画
  1. 调用ValueAnimator的ofInt()、ofFloat()或ofObject()静态方法创建ValueAnimator实例。
  2. 调用ValueAnimator的setXxx()方法设置动画持续时间、插值方式、重复次数等。
  3. 调用ValueAnimator的start()方法启动动画。
  4. 为ValueAnimator注册AnimatorUpdateListener监听器,在该监听器中可以监听ValueAnimator计算出来的值的改变,并将这些值应用到指定对象上。
2.使用ObjectAnimator创建动画

使用ObjectAnimator有如下几个注意点:

1.使用属性动画

属性动画既可作用于UI组件,也可作用于普通的对象。定义属性动画有两种方式:

使用属性动画的步骤如下所示:

  1. 创建ValueAnimator或ObjectAnimator对象(既可从XML资源文件加载该动画资源,也可直接调用ValueAnimator或ObjectAnimator的静态工厂方法来创建动画)。
  2. 根据需要为Animator对象设置属性。
  3. 如果需要监听Animator的动画开始事件、动画结束事件、动画重复事件、动画值改变事件,并根据事件提供相应的处理代码,则应该为Animator对象设置事件监听器。
  4. 如果有多个动画需要按次序或同时播放,则应使用AnimatorSet组合这些动画。
  5. 调用Animator对象的start()方法启动动画。

使用SurfaceView实现动画

SurfaceView一般会与SurfaceHolder结合使用,SurfaceHolder用于向与之关联的SurfaceView上绘图,调用SurfaceView的getHolder()方法即可获取SurfaceView关联SurfaceHolder。

SurfaceHolder提供了如下方法来获取Canvas对象:

好的,明天见。

我的微信公众号.jpg
上一篇下一篇

猜你喜欢

热点阅读