源码如下:
/*
* Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */译: 版权信息: 略
package android.view.animation;
import android.content.Context;
import android.content.res.TypedArray;import android.util.AttributeSet;/**
* An animation that controls the rotation of an object. This rotation takes * place int the X-Y plane. You can specify the point to use for the center of * the rotation, where (0,0) is the top left point. If not specified, (0,0) is * the default rotation point. */译: 类的说明:一个控制对象旋转的动画类, 本旋转发生在x,y平面上, 你可以指定旋转的中心点,
不指定的话,默认为0,0点.0,0点是左上角的点(是屏幕左上角还是View的左上角? 应该说的是View的).
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; //中心点private float mPivotX;
private float mPivotY;/**
* Constructor used when a RotateAnimation is loaded from a resource. * * @param context Application context to use * @param attrs Attribute set from which to read values */ 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();
}/**
* Constructor to use when building a RotateAnimation from code. * Default pivotX/pivotY point is (0,0). * * @param fromDegrees Rotation offset to apply at the start of the * animation. * * @param toDegrees Rotation offset to apply at the end of the animation. */ public RotateAnimation(float fromDegrees, float toDegrees) { mFromDegrees = fromDegrees; mToDegrees = toDegrees; mPivotX = 0.0f; mPivotY = 0.0f; }/**
* Constructor to use when building a RotateAnimation from code * * @param fromDegrees Rotation offset to apply at the start of the * animation. * * @param toDegrees Rotation offset to apply at the end of the animation. * * @param pivotX The X coordinate of the point about which the object is * being rotated, specified as an absolute number where 0 is the left * edge. * @param pivotY The Y coordinate of the point about which the object is * being rotated, specified as an absolute number where 0 is the top * edge. */ public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) { mFromDegrees = fromDegrees; mToDegrees = toDegrees;mPivotXType = ABSOLUTE;
mPivotYType = ABSOLUTE; mPivotXValue = pivotX; mPivotYValue = pivotY; }/**
* Constructor to use when building a RotateAnimation from code * * @param fromDegrees Rotation offset to apply at the start of the * animation. * * @param toDegrees Rotation offset to apply at the end of the animation. * * @param pivotXType Specifies how pivotXValue should be interpreted. One of * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or * Animation.RELATIVE_TO_PARENT. * @param pivotXValue The X coordinate of the point about which the object * is being rotated, specified as an absolute number where 0 is the * left edge. This value can either be an absolute number if * pivotXType is ABSOLUTE, or a percentage (where 1.0 is 100%) * otherwise. * @param pivotYType Specifies how pivotYValue should be interpreted. One of * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or * Animation.RELATIVE_TO_PARENT. * @param pivotYValue The Y coordinate of the point about which the object * is being rotated, specified as an absolute number where 0 is the * top edge. This value can either be an absolute number if * pivotYType is ABSOLUTE, or a percentage (where 1.0 is 100%) * otherwise. */ 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; }@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);它也是用matrix来实现旋转的,不是matrix的按z轴旋转和它一样, 是它就是这样实现的. } else { t.getMatrix().setRotate(degrees, mPivotX * scale, mPivotY * scale); } }@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); }}这篇文章有点糙啊,啥也没写, 本想深入分析一下实现过程, 也没什么,就四个构造器, 加两个方法 (一个initialize()一个applayTransformation()).