动画系列之补间动画

来源:互联网 发布:淘宝卖家信誉帐号 编辑:程序博客网 时间:2024/04/30 04:10
Android中的动画分为三类, 即帧动画、补间动画和属性动画。帧动画使用简单,就是把一系列图片按照一定的顺序进行排列,然后顺序播放,在实际的开发中一般不使用(因为容易出现OOM)。下面介绍今天的主角。


一、概念介绍:

补间动画又叫视图动画,是Android最早支持的动画,是通过对某一对象不断做图片变换(平移, 旋转, 缩放, 透明度)来实现动画效果的,是一种渐变式动画,支持自定义。
优点:执行效率高, 使用简单。
缺点:不具备交互性(相对于属性动画)。比如通过平移把view从A点移动到B点,此时点击B点不能触发对象的点击事件, 而点击A点可以触发。


二、相关属性介绍及使用

补间动画的分类名称标签对应的Java类
效果透明度动画<alpha>AlphaAnimation改变view的透明度平移动画<translate>TranslateAnimation移动view旋转动画<rotate>RotateAnimation旋转view缩放动画<scale>ScalaAnimation放大或缩小view

    1、常用属性:
    android:interpolator  动画的差值器, 影响动画的速率, 可以不写 默认使用加速减速差值器
    android : shareInterpolator  表示动画集合是否共用一个差值器, 如果集合没有指定,那么子组件如果需要 则需要单独指定, 如果为true 自动画的差值器没有效果
    android :  duration 动画的时间 默认为300ms,刷新频率为 10ms/帧
    android : fillAfter 动画结束后view停留的位置, true 表示停留在结束位置,false 表示动画结束放回开始位置

    各种动画的独有属性
    透明度动画
    android: fromAlpha  view透明度的起始值
    android:toAlpha view透明度的结束值

    平移动画
    android : fromXDelta 表示X轴的起始值
    android : toXDelta 表示X轴的结束值
    android : fromYDelta 表示Y轴的起始值
    android:toYDleta 表示Y轴的结束值

    旋转动画
    android : fromDegrees  旋转开始的角度
    android : toDegrees  旋转结束的角度
    android : pivotX  旋转轴点X轴坐标值
    android : pivotY  旋转轴点Y轴坐标值

    缩放动画
    android : fromXScale 水平方向旋转的起始值
    android : toXScale 水平方向旋转的结束值
    android : fromYScale 垂直方向旋转的起始值
    android : toYScale 垂直方向旋转的结束值
    android : pivotX 旋转轴点X轴的坐标值

    android : pivotY 旋转轴点的Y轴的坐标值


   2、xml实现动画(此处使用移动动画进行示例,其他动画操作类似)
    xml实现动画(此处使用移动动画为例, 其他的实现类似)
    a、在res/anim目录下创建一个xml文件, 进行动画的实现。b、在代码中通过  Animation animation =  AnimationUtils.loadAnimation(this, R.anim.anim);获取动画对象 然后把动画添加到view中并开始动  画,view.startAnimation(animation), 代码如下:

<?xml version="1.0" encoding="utf-8"?>   <set xmlns:android="http://schemas.android.com/apk/res/android">      <translate android:fromXDelta="100"        android:toXDelta="300"        android:fromYDelta="100"        android:toYDelta="300"        android:duration="3000"/>    </set>
在Java文件中进行引用
 Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim); view.startAnimation(animation);
 3、代码实现动画
TranslateAnimation animation = new TranslateAnimation(100, 300, 100, 300);animation.setDuration(3000); view.startAnimation(animation);

三、补间动画的自定义
    实现步骤:
    1、自定义一个类 继承 Animation
    2、重写 initialize() 方法 进行初始化操作
    3、重写 applyTransformation() 实现自定义动画, 一般需要借助于Camera类(android.graphics.Camera)
    applyTransformation方法 的两个参数
    float interpolatedTime : 差值器完成的时间 取值范围 0.0 - 1.0
    Transformation t : 转换器对象 可以获取一个矩(Matrix)阵对象
    示例代码如下: (本段代码摘自 《Android开发艺术探索》)

public class Rotate3dAnimation  extends Animation {    private int mCenterX;    private int mCenterY;    private float mFromDegrees;    private float mToDegrees;    private float mDepthZ;    private boolean isReverse; //是否反向    private Camera mCamera;    public Rotate3dAnimation(int mCenterX, int mCenterY, float mFromDegrees, float mToDegrees, float mDepthZ, boolean isReverse) {        this.mCenterX = mCenterX;        this.mCenterY = mCenterY;        this.mFromDegrees = mFromDegrees;        this.mToDegrees = mToDegrees;        this.mDepthZ = mDepthZ;        this.isReverse = isReverse;    }    @Override    public void initialize(int width, int height, int parentWidth, int parentHeight) {        super.initialize(width, height, parentWidth, parentHeight);        mCamera = new Camera();    }    @Override    protected void applyTransformation(float interpolatedTime, Transformation t) {        super.applyTransformation(interpolatedTime, t);        Matrix matrix = t.getMatrix();        int centerX = mCenterX;        int centerY = mCenterY;        float degrees = mFromDegrees + (mToDegrees - mFromDegrees) * interpolatedTime;        Camera camera = mCamera;        camera.save();        if (isReverse)            camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);        else            camera.translate(0.0f, 0.0f, mDepthZ * (1 - interpolatedTime));        camera.rotateY(degrees);        camera.getMatrix(matrix);        camera.restore();        matrix.preTranslate(-centerX, -centerY);        matrix.postTranslate(centerX, centerY);    }   


四、补间动画的特殊使用

1、 layoutAnimation 的使用
layoutAnimation 作用于viewGroup 表示为viewGroup添加一个动画,当加载viewGroup的子组件时, 会具有该动画效果
实现步骤:
a. 在res/anim 目录下创建一个xml 文件 进行layoutAnimation的设置

<?xml version="1.0" encoding="utf-8"?><layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"    android:delay="0.5"    android:animationOrder="normal"    android:animation="@anim/anim_item"/>

android:delay 表示动画延迟的时间
android:animationOrder 表示子组件动画的顺序   normal  顺序显示  reverse 逆序显示 random 随机显示
android:animation 引用一个动画  表示子组件显示的动画

b. 在 res/anim 目录下定义需要引入的动画
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <alpha android:fromAlpha="1"        android:toAlpha="0"        android:duration="3000"/>    <rotate        android:fromDegrees="0"        android:toDegrees="360"        android:duration="3000"/></set>
c. 在xml 布局文件中通过android:layoutAnimation 属性引入定义的layoutAnimation 文件,
<ListView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layoutAnimation="@anim/anim_layout"        android:background="#fff4f7f9"        android:divider="#ffdddbdb"        android:dividerHeight="1dp"        android:id="@+id/listView"/>

使用动态代码实现的方式如下:

Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);LayoutAnimationController controller = new LayoutAnimationController(animation);controller.setDelay(0.5f);controller.setOrder(LayoutAnimationController.ORDER_NORMAL);listView.setLayoutAnimation(controller);
2、 自定义activity之间切换的动画效果
activity之间的切换默认是自带动画效果的, 有时为了满足产品需求 ,需要更改动画效果。具体实现如下,
调用overridePendingTransition(int enterAnim, int exitAnim)  参数分别为进入动画和退出动画的资源ID
注意:  该方法需要在startActivity() 和 finish() 之后调用动画才会生效。
private void goActivity(Class clzz){     Intent intent = new Intent();     intent.setClass(this, clzz);     startActivity(intent);     finish();    overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);} 
Fragment 之间也可以自定义切换动画, 由于Frangment是API11 引入的, 所以要采用v4包下的Fragment(解决兼容性问题) 。通过使用FragmentTransaction类中的setCustomAnimations( int enter, int exit) 实现切换动画。