2011-10-24 6 views

答えて

0

package com.test; 


import android.content.Context; 
import android.content.res.TypedArray; 
import android.util.AttributeSet; 
import android.view.animation.Animation; 
import android.view.animation.Transformation; 

/** 
* 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. 
* 
*/ 
public class MyRotateAnimation 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 ZenRotateAnimation(Context context, AttributeSet attrs) { 
     super(context, attrs); 

    } 

    /** 
    * 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 MyRotateAnimation(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 MyRotateAnimation(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 MyRotateAnimation(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); 

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

    @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); 
    } 

    /** 
    * @return the mFromDegrees 
    */ 
    public synchronized float getmFromDegrees() { 
     return mFromDegrees; 
    } 

    /** 
    * @param mFromDegrees the mFromDegrees to set 
    */ 
    public synchronized void setmFromDegrees(float mFromDegrees) { 
     this.mFromDegrees = mFromDegrees; 
    } 

    /** 
    * @return the mToDegrees 
    */ 
    public synchronized float getmToDegrees() { 
     return mToDegrees; 
    } 

    /** 
    * @param mToDegrees the mToDegrees to set 
    */ 
    public synchronized void setmToDegrees(float mToDegrees) { 
     this.mToDegrees = mToDegrees; 
    } 

    /** 
    * @return the mPivotXType 
    */ 
    public synchronized int getmPivotXType() { 
     return mPivotXType; 
    } 

    /** 
    * @param mPivotXType the mPivotXType to set 
    */ 
    public synchronized void setmPivotXType(int mPivotXType) { 
     this.mPivotXType = mPivotXType; 
    } 

    /** 
    * @return the mPivotYType 
    */ 
    public synchronized int getmPivotYType() { 
     return mPivotYType; 
    } 

    /** 
    * @param mPivotYType the mPivotYType to set 
    */ 
    public synchronized void setmPivotYType(int mPivotYType) { 
     this.mPivotYType = mPivotYType; 
    } 

    /** 
    * @return the mPivotXValue 
    */ 
    public synchronized float getmPivotXValue() { 
     return mPivotXValue; 
    } 

    /** 
    * @param mPivotXValue the mPivotXValue to set 
    */ 
    public synchronized void setmPivotXValue(float mPivotXValue) { 
     this.mPivotXValue = mPivotXValue; 
    } 

    /** 
    * @return the mPivotYValue 
    */ 
    public synchronized float getmPivotYValue() { 
     return mPivotYValue; 
    } 

    /** 
    * @param mPivotYValue the mPivotYValue to set 
    */ 
    public synchronized void setmPivotYValue(float mPivotYValue) { 
     this.mPivotYValue = mPivotYValue; 
    } 

    /** 
    * @return the mPivotX 
    */ 
    public synchronized float getmPivotX() { 
     return mPivotX; 
    } 

    /** 
    * @param mPivotX the mPivotX to set 
    */ 
    public synchronized void setmPivotX(float mPivotX) { 
     this.mPivotX = mPivotX; 
    } 

    /** 
    * @return the mPivotY 
    */ 
    public synchronized float getmPivotY() { 
     return mPivotY; 
    } 

    /** 
    * @param mPivotY the mPivotY to set 
    */ 
    public synchronized void setmPivotY(float mPivotY) { 
     this.mPivotY = mPivotY; 
    } 


} 
+0

どのように使用しますか? – strangetimes

0

cancel()startOffsetTime()およびrestrictDuration()です。でも、私は度を変更するには、任意のAPIを見ていないので、あなたは新しい。これは、(必要なフィールドに追加したgetterとsetter)あなたを助けることができる​​

0

受け入れ答えを開始する必要があります私のために働かなかった。必要なのは、現在のアニメーションを「スムーズに」続けることです。代わりに、私は、使用することができます「は現在使用」度、返すために少しRotationAnimationクラスを変更:

/** 
* Allows you to fetch the currently 'used' animation degrees so you can create a new animator 
* out of it, allowing smooth animation 
*/ 
class AdjustableRotationAnimation extends Animation { 
private float mFromDegrees; 
private float mToDegrees; 
private volatile float mAnimatedDegrees; 

private int mPivotXType = ABSOLUTE; 
private int mPivotYType = ABSOLUTE; 
private float mPivotXValue = 0.0f; 
private float mPivotYValue = 0.0f; 

private float mPivotX; 
private float mPivotY; 

public AdjustableRotationAnimation(Context context, AttributeSet attrs) { 
    super(context, attrs); 

} 

public AdjustableRotationAnimation(float fromDegrees, float toDegrees) { 
    mFromDegrees = fromDegrees; 
    mToDegrees = toDegrees; 
    mPivotX = 0.0f; 
    mPivotY = 0.0f; 
} 

public AdjustableRotationAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) { 
    mFromDegrees = fromDegrees; 
    mToDegrees = toDegrees; 

    mPivotXType = ABSOLUTE; 
    mPivotYType = ABSOLUTE; 
    mPivotXValue = pivotX; 
    mPivotYValue = pivotY; 
} 


    public AdjustableRotationAnimation(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) { 
    mAnimatedDegrees = mFromDegrees + ((mToDegrees - mFromDegrees) * interpolatedTime); 
    float scale = getScaleFactor(); 

    if (mPivotX == 0.0f && mPivotY == 0.0f) { 
     t.getMatrix().setRotate(mAnimatedDegrees); 
    } else { 
    t.getMatrix().setRotate(mAnimatedDegrees, 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); 
} 

public synchronized float getAnimatedDegrees() { 
    return mAnimatedDegrees; 
} 
} 

をそして、これは私がそれを使用する方法です:

currentRotate = currentRotate % DEGREES_360; 
    int animationDuration = 400; 

    if (rotateAnimation != null && !rotateAnimation.hasEnded()) { 
    rotateAnimation = new AdjustableRotationAnimation(rotateAnimation.getAnimatedDegrees(), currentRotate, Animation.RELATIVE_TO_SELF, CENTER, Animation.RELATIVE_TO_SELF, CENTER); 
    rotateAnimation.setInterpolator(new DecelerateInterpolator()); 
    rotateAnimation.setDuration(animationDuration); 
    rotateAnimation.setFillAfter(true); 
    rotateAnimation.setAnimationListener(this); 
    } else { 
    rotateAnimation = new AdjustableRotationAnimation(lastRotation, currentRotate, Animation.RELATIVE_TO_SELF, CENTER, Animation.RELATIVE_TO_SELF, CENTER); 
    rotateAnimation.setInterpolator(new DecelerateInterpolator()); 
    rotateAnimation.setDuration(animationDuration); 
    rotateAnimation.setFillAfter(true); 
    rotateAnimation.setAnimationListener(this); 
    } 

    viewToRotate.startAnimation(rotateAnimation); 

これは、新しいアニメーションを作成します毎回、しかし、それは継続の感情を与えるだろうし、アニメーションはスムーズにそれがどこでキャンセルされたから継続します。

関連する問題