动画系列之补间动画

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) 实现切换动画。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值