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