补间动画详解三 旋转动画RotateAnimation

原创 2016年08月29日 17:15:47
RotateAnimation是旋转动画的类,用于控制View的旋转动作。

RotateAnimation类官方文档:
https://developer.android.com/reference/android/view/animation/RotateAnimation.html

关于父类Animation的详解可参考文章:
http://blog.csdn.net/ruancoder/article/details/52347243

一、RotateAnimation的使用
(1).使用xml文件创建RotateAnimation

属性说明:
android:fromDegrees
旋转开始角度,正数表示顺时针方向,负数表示逆时针方向。
android:toDegrees
旋转结束角度,正数表示顺时针方向,负数表示逆时针方向。
android:pivotX
旋转中心点的X坐标。有三种表示方式,一是纯数字,使用绝对位置(比如"50",表示以当前View左上角坐标加50px作为X坐标);二是百分数,相对于控件本身定位(比如"50%",表示以当前View的左上角加上当前View宽度的50%作为X坐标);三是百分数p,相对于父控件定位(比如"50%p",表示以当前View的左上角加上父控件宽度的50%做为X坐标)。
android:pivotY
旋转中心点的Y坐标。规律同上。

示例代码:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:duration="3000">
    <rotate
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360"/>
</set>


// 以view中心为旋转点
Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate);
view.startAnimation(animation);

(2).使用java代码创建RotateAnimation

示例代码:

// 以view左上角为旋转点
RotateAnimation animation = new RotateAnimation(0.0f, 360.0f);
animation.setDuration(3000);
view.startAnimation(animation);

// 以view左上角,X轴增加10px,Y轴增加50px,为旋转点
RotateAnimation animation = new RotateAnimation(0.0f, 360.0f, 10.0f, 50.0f);
animation.setDuration(3000);
view.startAnimation(animation);

// 以view中心为旋转点
RotateAnimation animation = new RotateAnimation(0.0f, 360.0f,
        Animation.RELATIVE_TO_SELF, 0.5f,
        Animation.RELATIVE_TO_SELF, 0.5f);
animation.setDuration(3000);
view.startAnimation(animation);

二、RotateAnimation的分析

RotateAnimation继承自Animation,除了拥有父类的属性外,添加了mFromDegrees、mToDegrees、mPivotXType、mPivotYType四个属性。
public class RotateAnimation extends Animation {
    private float mFromDegrees;
    private float mToDegrees;
    private int mPivotXType = ABSOLUTE;
    private int mPivotYType = ABSOLUTE;
    private float mPivotXValue = 0.0f;
    private float mPivotYValue = 0.0f;    
}

mPivotX和mPivotY最终参与动画的计算,在ABSOLUTE类型下,mPivotXValue和mPivotYValue会赋值给mPivotX和mPivotY。

initializePivotPoint()在构造方法中被调用。

private float mPivotX;
private float mPivotY;

private void initializePivotPoint() {
    if (mPivotXType == ABSOLUTE) {
        mPivotX = mPivotXValue;
    }
    if (mPivotYType == ABSOLUTE) {
        mPivotY = mPivotYValue;
    }
}

使用java代码的方式创建RotateAnimation,传入六个参数,fromDegrees、toDegrees、pivotXType、pivotXValue、pivotYType和pivotYValue,使用如下构造方法。
参数说明:
fromDegrees:旋转开始角度。
toDegrees:旋转结束角度。
pivotXType:旋转中心点的X坐标类型。取值范围为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
pivotXValue:旋转中心点的X坐标值。当pivotXType==ABSOLUTE时,表示绝对位置;否则表示相对位置,1.0表示100%。
pivotYType:旋转中心点的Y坐标类型,同pivotXType。
pivotYValue:旋转中心点的Y坐标值,同pivotXValue。
public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,
                       int pivotYType, float pivotYValue) {
    mFromDegrees = fromDegrees;
    mToDegrees = toDegrees;


    mPivotXValue = pivotXValue;
    mPivotXType = pivotXType;
    mPivotYValue = pivotYValue;
    mPivotYType = pivotYType;
    initializePivotPoint();
}

使用java代码的方式创建RotateAnimation,传入四个参数,fromDegrees、toDegrees、pivotX和pivotY,使用如下构造方法。
此时mPivotXType和mPivotYType默认为ABSOLUTE。
public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) {
    mFromDegrees = fromDegrees;
    mToDegrees = toDegrees;


    mPivotXType = ABSOLUTE;
    mPivotYType = ABSOLUTE;
    mPivotXValue = pivotX;
    mPivotYValue = pivotY;
    initializePivotPoint();
}

使用java代码的方式创建RotateAnimation,传入两个参数,fromDegrees和toDegrees,使用如下构造方法。
此时mPivotXType和mPivotYType默认为ABSOLUTE,mPivotX和mPivotY默认为0。
public RotateAnimation(float fromDegrees, float toDegrees) {
    mFromDegrees = fromDegrees;
    mToDegrees = toDegrees;
    mPivotX = 0.0f;
    mPivotY = 0.0f;
}

当使用xml文件的方式创建RotateAnimation时,由AnimationUtils工具类加载动画文件,使用如下构造方法,通过xml中的属性来获取值。
public RotateAnimation(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray a = context.obtainStyledAttributes(attrs,
            com.android.internal.R.styleable.RotateAnimation);

    mFromDegrees = a.getFloat(
            com.android.internal.R.styleable.RotateAnimation_fromDegrees, 0.0f);
    mToDegrees = a.getFloat(com.android.internal.R.styleable.RotateAnimation_toDegrees, 0.0f);

    Description d = Description.parseValue(a.peekValue(
            com.android.internal.R.styleable.RotateAnimation_pivotX));
    mPivotXType = d.type;
    mPivotXValue = d.value;

    d = Description.parseValue(a.peekValue(
            com.android.internal.R.styleable.RotateAnimation_pivotY));
    mPivotYType = d.type;
    mPivotYValue = d.value;

    a.recycle();

    initializePivotPoint();
}

完成成员变量的初始化后,接下来进入动画的计算。核心在于重写父类Animation的initialize()和applyTransformation()方法。

initialize()方法中,根据PivotType、当前View和父View的宽高,将PivotValue转化为绝对位置。
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
    super.initialize(width, height, parentWidth, parentHeight);
    mPivotX = resolveSize(mPivotXType, mPivotXValue, width, parentWidth);
    mPivotY = resolveSize(mPivotYType, mPivotYValue, height, parentHeight);
}

protected float resolveSize(int type, float value, int size, int parentSize) {
    switch (type) {
        case ABSOLUTE:
            return value;
        case RELATIVE_TO_SELF:
            return size * value;
        case RELATIVE_TO_PARENT:
            return parentSize * value;
        default:
            return value;
    }
}

applyTransformation()方法负责动画的执行。在动画从开始倒结束的过程中,参数interpolatedTime从0.0递增到1.0。通过不断的调整degrees的值,调用Matrix的setRotate()方法,达到旋转动画的效果。
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    float degrees = mFromDegrees + ((mToDegrees - mFromDegrees) * interpolatedTime);
    float scale = getScaleFactor();


    if (mPivotX == 0.0f && mPivotY == 0.0f) {
        t.getMatrix().setRotate(degrees);
    } else {
        t.getMatrix().setRotate(degrees, mPivotX * scale, mPivotY * scale);
    }
}

版权声明:本文为博主原创文章,转载请注明出处。

相关文章推荐

Android的源代码下载教程-android学习之旅(102)

一.环境准备 == ## 1.安装ubuntu系统,或者虚拟机。 ## ## 2.安装java的sdk ## ## 3.安装依赖包 ,命令是:sudo apt-get install flex bis...

RotateAnimation 旋转动画效果

  • 2014年09月25日 17:39
  • 4.48MB
  • 下载

Android利用RotateAnimation实现旋转变化动画

http://www.alnton.com/?p=343 RotateAnimation类是Android系统中的旋转变化动画类,用于控制View对象的旋转动作,该类继承于Animation类。...

Android Tween动画之RotateAnimation实现图片不停旋转

Android Tween动画之RotateAnimation实现图片不停旋转 本文主要介绍Android中如何使用rotate实现图片不停旋转的效果。Android 平台提供了两类...

Android Tween动画之RotateAnimation实现图片360°不停旋转

Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类是 Frame 动画,即顺序播放事先做好的图像,跟电影类似。本文...

RotateAnimation旋转动画Demo

一、在java中实现动画: package com.jikexueyuan.rotateanimation; import android.app.Activity; import android...

Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍

Android中如何使用rotate实现图片不停旋转的效果,下面与大家共同分析下Tween动画的rotate实现旋转效果,感兴趣的朋友可以参考下哈 主要介绍Android中如何使用rotate实...
  • zjy_hll
  • zjy_hll
  • 2014年11月11日 13:41
  • 248

RotateAnimation类:旋转变化动画类

RotateAnimation类:旋转变化动画类 RotateAnimation类是Android系统中的旋转变化动画类,用于控制View对象的旋转动作,该类继承于Animation类。Rotate...

RotateAnimation类:旋转变化动画类的使用和总结

RotateAnimation类是Android系统中的旋转变化动画类,用于控制View对象的旋转动作,该类继承于Animation类。RotateAnimation类中的很多方法都与Animatio...
  • wf_zeng
  • wf_zeng
  • 2013年07月16日 14:35
  • 1650

Android Tween动画之RotateAnimation实现图片不停旋转

本文主要介绍Android中如何使用rotate实现图片不停旋转的效果。Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:补间动画详解三 旋转动画RotateAnimation
举报原因:
原因补充:

(最多只允许输入30个字)