19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view.animation;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
20e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghuiimport android.content.res.Resources;
21e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghuiimport android.content.res.Resources.Theme;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghuiimport com.android.internal.R;
26c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckimport com.android.internal.view.animation.HasNativeInterpolator;
27c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckimport com.android.internal.view.animation.NativeInterpolatorFactory;
28c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckimport com.android.internal.view.animation.NativeInterpolatorFactoryHelper;
29c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
31e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * An interpolator where the rate of change starts out slowly and
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then accelerates.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
35c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck@HasNativeInterpolator
36d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyarpublic class AccelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
378b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru    private final float mFactor;
388b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru    private final double mDoubleFactor;
398b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AccelerateInterpolator() {
418b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru        mFactor = 1.0f;
428b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru        mDoubleFactor = 2.0;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor
47e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     *
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param factor Degree to which the animation should be eased. Seting
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        factor to 1.0f produces a y=x^2 parabola. Increasing factor above
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        1.0f  exaggerates the ease-in effect (i.e., it starts even
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        slower and ends evens faster)
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AccelerateInterpolator(float factor) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFactor = factor;
558b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru        mDoubleFactor = 2 * mFactor;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AccelerateInterpolator(Context context, AttributeSet attrs) {
59e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        this(context.getResources(), context.getTheme(), attrs);
60e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui    }
61e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
62e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui    /** @hide */
63e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui    public AccelerateInterpolator(Resources res, Theme theme, AttributeSet attrs) {
64e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        TypedArray a;
65e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        if (theme != null) {
66e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui            a = theme.obtainStyledAttributes(attrs, R.styleable.AccelerateInterpolator, 0, 0);
67e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        } else {
68e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui            a = res.obtainAttributes(attrs, R.styleable.AccelerateInterpolator);
69e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        }
70e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
71e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        mFactor = a.getFloat(R.styleable.AccelerateInterpolator_factor, 1.0f);
728b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru        mDoubleFactor = 2 * mFactor;
73d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar        setChangingConfiguration(a.getChangingConfigurations());
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
76e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getInterpolation(float input) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFactor == 1.0f) {
798b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru            return input * input;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
818b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru            return (float)Math.pow(input, mDoubleFactor);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
84c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
85c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    /** @hide */
86c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    @Override
87c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    public long createNativeInterpolator() {
88c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck        return NativeInterpolatorFactoryHelper.createAccelerateInterpolator(mFactor);
89c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
91