animation of android (2)

17850 ワード

android  Interpolator  
まずandroidシステムが提供する変換方法です.
これらの方法では、次の文章が転載されます.
回転:http://www.cnblogs.com/mengdd/p/3346003.html
AndroidのInterpolator
AndroidのInterpolator
Interpolatorはアニメーションの時間補間に使用され、0から1の浮動小数点値の変化を別の浮動小数点値の変化にマッピングする役割を果たします.
この文書では、Android APIが提供するInterpolatorのいくつかの実装をリストし、ソースコードをリストし、1つのプログラムで数学曲線を描画します.(プロジェクトリンクは文の後ろに添付されています).
 
AccelerateDecelerateInterpolator
/**

 * An interpolator where the rate of change starts and ends slowly but

 * accelerates through the middle.

 * 

 */

public class AccelerateDecelerateInterpolator implements Interpolator {

    public AccelerateDecelerateInterpolator() {

    }

    

    @SuppressWarnings({"UnusedDeclaration"})

    public AccelerateDecelerateInterpolator(Context context, AttributeSet attrs) {

    }

    

    public float getInterpolation(float input) {

        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;

    }

}


 
animation of android (2)
 
AccelerateInterpolator
/**

 * An interpolator where the rate of change starts out slowly and 

 * and then accelerates.

 *

 */

public class AccelerateInterpolator implements Interpolator {

    private final float mFactor;

    private final double mDoubleFactor;



    public AccelerateInterpolator() {

        mFactor = 1.0f;

        mDoubleFactor = 2.0;

    }

    

    /**

     * Constructor

     * 

     * @param factor Degree to which the animation should be eased. Seting

     *        factor to 1.0f produces a y=x^2 parabola. Increasing factor above

     *        1.0f  exaggerates the ease-in effect (i.e., it starts even

     *        slower and ends evens faster)

     */

    public AccelerateInterpolator(float factor) {

        mFactor = factor;

        mDoubleFactor = 2 * mFactor;

    }

    

    public AccelerateInterpolator(Context context, AttributeSet attrs) {

        TypedArray a =

            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.AccelerateInterpolator);

        

        mFactor = a.getFloat(com.android.internal.R.styleable.AccelerateInterpolator_factor, 1.0f);

        mDoubleFactor = 2 * mFactor;



        a.recycle();

    }

    

    public float getInterpolation(float input) {

        if (mFactor == 1.0f) {

            return input * input;

        } else {

            return (float)Math.pow(input, mDoubleFactor);

        }

    }

}


 
animation of android (2)
AnticipateInterpolator
/**

 * An interpolator where the change starts backward then flings forward.

 */

public class AnticipateInterpolator implements Interpolator {

    private final float mTension;



    public AnticipateInterpolator() {

        mTension = 2.0f;

    }



    /**

     * @param tension Amount of anticipation. When tension equals 0.0f, there is

     *                no anticipation and the interpolator becomes a simple

     *                acceleration interpolator.

     */

    public AnticipateInterpolator(float tension) {

        mTension = tension;

    }



    public AnticipateInterpolator(Context context, AttributeSet attrs) {

        TypedArray a = context.obtainStyledAttributes(attrs,

                com.android.internal.R.styleable.AnticipateInterpolator);



        mTension =

                a.getFloat(com.android.internal.R.styleable.AnticipateInterpolator_tension, 2.0f);



        a.recycle();

    }



    public float getInterpolation(float t) {

        // a(t) = t * t * ((tension + 1) * t - tension)

        return t * t * ((mTension + 1) * t - mTension);

    }

}


animation of android (2)
 
 
AnticipateOvershootInterpolator
/**

 * An interpolator where the change starts backward then flings forward and overshoots

 * the target value and finally goes back to the final value.

 */

public class AnticipateOvershootInterpolator implements Interpolator {

    private final float mTension;



    public AnticipateOvershootInterpolator() {

        mTension = 2.0f * 1.5f;

    }



    /**

     * @param tension Amount of anticipation/overshoot. When tension equals 0.0f,

     *                there is no anticipation/overshoot and the interpolator becomes

     *                a simple acceleration/deceleration interpolator.

     */

    public AnticipateOvershootInterpolator(float tension) {

        mTension = tension * 1.5f;

    }



    /**

     * @param tension Amount of anticipation/overshoot. When tension equals 0.0f,

     *                there is no anticipation/overshoot and the interpolator becomes

     *                a simple acceleration/deceleration interpolator.

     * @param extraTension Amount by which to multiply the tension. For instance,

     *                     to get the same overshoot as an OvershootInterpolator with

     *                     a tension of 2.0f, you would use an extraTension of 1.5f.

     */

    public AnticipateOvershootInterpolator(float tension, float extraTension) {

        mTension = tension * extraTension;

    }



    public AnticipateOvershootInterpolator(Context context, AttributeSet attrs) {

        TypedArray a = context.obtainStyledAttributes(attrs, AnticipateOvershootInterpolator);



        mTension = a.getFloat(AnticipateOvershootInterpolator_tension, 2.0f) *

                a.getFloat(AnticipateOvershootInterpolator_extraTension, 1.5f);



        a.recycle();

    }



    private static float a(float t, float s) {

        return t * t * ((s + 1) * t - s);

    }



    private static float o(float t, float s) {

        return t * t * ((s + 1) * t + s);

    }



    public float getInterpolation(float t) {

        // a(t, s) = t * t * ((s + 1) * t - s)

        // o(t, s) = t * t * ((s + 1) * t + s)

        // f(t) = 0.5 * a(t * 2, tension * extraTension), when t < 0.5

        // f(t) = 0.5 * (o(t * 2 - 2, tension * extraTension) + 2), when t <= 1.0

        if (t < 0.5f) return 0.5f * a(t * 2.0f, mTension);

        else return 0.5f * (o(t * 2.0f - 2.0f, mTension) + 2.0f);

    }

}


animation of android (2)
BounceInterpolator
/**

 * An interpolator where the change bounces at the end.

 */

public class BounceInterpolator implements Interpolator {

    public BounceInterpolator() {

    }



    @SuppressWarnings({"UnusedDeclaration"})

    public BounceInterpolator(Context context, AttributeSet attrs) {

    }



    private static float bounce(float t) {

        return t * t * 8.0f;

    }



    public float getInterpolation(float t) {

        // _b(t) = t * t * 8

        // bs(t) = _b(t) for t < 0.3535

        // bs(t) = _b(t - 0.54719) + 0.7 for t < 0.7408

        // bs(t) = _b(t - 0.8526) + 0.9 for t < 0.9644

        // bs(t) = _b(t - 1.0435) + 0.95 for t <= 1.0

        // b(t) = bs(t * 1.1226)

        t *= 1.1226f;

        if (t < 0.3535f) return bounce(t);

        else if (t < 0.7408f) return bounce(t - 0.54719f) + 0.7f;

        else if (t < 0.9644f) return bounce(t - 0.8526f) + 0.9f;

        else return bounce(t - 1.0435f) + 0.95f;

    }

}


 
animation of android (2)
CycleInterpolator
/**

 * Repeats the animation for a specified number of cycles. The

 * rate of change follows a sinusoidal pattern.

 *

 */

public class CycleInterpolator implements Interpolator {

    public CycleInterpolator(float cycles) {

        mCycles = cycles;

    }

    

    public CycleInterpolator(Context context, AttributeSet attrs) {

        TypedArray a =

            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.CycleInterpolator);

        

        mCycles = a.getFloat(com.android.internal.R.styleable.CycleInterpolator_cycles, 1.0f);

        

        a.recycle();

    }

    

    public float getInterpolation(float input) {

        return (float)(Math.sin(2 * mCycles * Math.PI * input));

    }

    

    private float mCycles;

}


 
パラメータが2の場合のカーブ:
animation of android (2)
 
DecelerateInterpolator
/**

 * An interpolator where the rate of change starts out quickly and 

 * and then decelerates.

 *

 */

public class DecelerateInterpolator implements Interpolator {

    public DecelerateInterpolator() {

    }



    /**

     * Constructor

     * 

     * @param factor Degree to which the animation should be eased. Setting factor to 1.0f produces

     *        an upside-down y=x^2 parabola. Increasing factor above 1.0f makes exaggerates the

     *        ease-out effect (i.e., it starts even faster and ends evens slower)

     */

    public DecelerateInterpolator(float factor) {

        mFactor = factor;

    }

    

    public DecelerateInterpolator(Context context, AttributeSet attrs) {

        TypedArray a =

            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.DecelerateInterpolator);

        

        mFactor = a.getFloat(com.android.internal.R.styleable.DecelerateInterpolator_factor, 1.0f);

        

        a.recycle();

    }

    

    public float getInterpolation(float input) {

        float result;

        if (mFactor == 1.0f) {

            result = (float)(1.0f - (1.0f - input) * (1.0f - input));

        } else {

            result = (float)(1.0f - Math.pow((1.0f - input), 2 * mFactor));

        }

        return result;

    }

    

    private float mFactor = 1.0f;

}


 
animation of android (2)
LinearInterpolator
/**

 * An interpolator where the rate of change is constant

 *

 */

public class LinearInterpolator implements Interpolator {



    public LinearInterpolator() {

    }

    

    public LinearInterpolator(Context context, AttributeSet attrs) {

    }

    

    public float getInterpolation(float input) {

        return input;

    }

}


 
animation of android (2)
OvershootInterpolator
/**

 * An interpolator where the change flings forward and overshoots the last value

 * then comes back.

 */

public class OvershootInterpolator implements Interpolator {

    private final float mTension;



    public OvershootInterpolator() {

        mTension = 2.0f;

    }



    /**

     * @param tension Amount of overshoot. When tension equals 0.0f, there is

     *                no overshoot and the interpolator becomes a simple

     *                deceleration interpolator.

     */

    public OvershootInterpolator(float tension) {

        mTension = tension;

    }



    public OvershootInterpolator(Context context, AttributeSet attrs) {

        TypedArray a = context.obtainStyledAttributes(attrs,

                com.android.internal.R.styleable.OvershootInterpolator);



        mTension =

                a.getFloat(com.android.internal.R.styleable.OvershootInterpolator_tension, 2.0f);



        a.recycle();

    }



    public float getInterpolation(float t) {

        // _o(t) = t * t * ((tension + 1) * t + tension)

        // o(t) = _o(t - 1) + 1

        t -= 1.0f;

        return t * t * ((mTension + 1) * t + mTension) + 1.0f;

    }

}


 
animation of android (2)
 2.上の図のように、すべての変換方式は、実は0~1の間の関数曲線があります.したがって,すべての関数は原則としてy=f(x)関数にすぎない.
以下はカスタムInterpolatorです.
    //baseinterpolater is basd on Added in API level 22

    // we just suing interpolater

    public static class MyInterpolater2 implements Interpolator {

        

        private static final String TAG = "MyInterpolater2";

        private float a = -1.0f;

        private float x2 = 2.0f;

        /*we defined an two arc y = a(x-x1)(x-x2)

         * 

         * */

        @Override

        public float getInterpolation(float input) {

            if (input <= 0.5)

                return input * input;

                else

                return (1 - input) * (1 - input);

        }        

        

    }