19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
22e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghuiimport android.content.res.Resources.Theme;
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 quickly and
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then decelerates.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
35c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck@HasNativeInterpolator
36d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyarpublic class DecelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DecelerateInterpolator() {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3952964243dc95f74ac2ab9a96d031a36931a11931Gilles Debunne
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor
42e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     *
4352964243dc95f74ac2ab9a96d031a36931a11931Gilles Debunne     * @param factor Degree to which the animation should be eased. Setting factor to 1.0f produces
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        an upside-down y=x^2 parabola. Increasing factor above 1.0f makes exaggerates the
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        ease-out effect (i.e., it starts even faster and ends evens slower)
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DecelerateInterpolator(float factor) {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFactor = factor;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DecelerateInterpolator(Context context, AttributeSet attrs) {
52e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        this(context.getResources(), context.getTheme(), attrs);
53e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui    }
54e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
55e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui    /** @hide */
56e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui    public DecelerateInterpolator(Resources res, Theme theme, AttributeSet attrs) {
57e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        TypedArray a;
58e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        if (theme != null) {
59e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui            a = theme.obtainStyledAttributes(attrs, R.styleable.DecelerateInterpolator, 0, 0);
60e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        } else {
61e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui            a = res.obtainAttributes(attrs, R.styleable.DecelerateInterpolator);
62e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        }
63e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
64e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        mFactor = a.getFloat(R.styleable.DecelerateInterpolator_factor, 1.0f);
65d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar        setChangingConfiguration(a.getChangingConfigurations());
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
68e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getInterpolation(float input) {
706908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn        float result;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFactor == 1.0f) {
726908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn            result = (float)(1.0f - (1.0f - input) * (1.0f - input));
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
746908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn            result = (float)(1.0f - Math.pow((1.0f - input), 2 * mFactor));
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
766908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn        return result;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mFactor = 1.0f;
80c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
81c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    /** @hide */
82c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    @Override
83c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    public long createNativeInterpolator() {
84c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck        return NativeInterpolatorFactoryHelper.createDecelerateInterpolator(mFactor);
85c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
87