18b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru/* 28b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * Copyright (C) 2009 The Android Open Source Project 38b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * 48b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License"); 58b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * you may not use this file except in compliance with the License. 68b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * You may obtain a copy of the License at 78b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * 88b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * http://www.apache.org/licenses/LICENSE-2.0 98b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * 108b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software 118b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS, 128b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * See the License for the specific language governing permissions and 148b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * limitations under the License. 158b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru */ 168b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 178b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Querupackage android.view.animation; 188b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 198b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queruimport android.content.Context; 208b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queruimport android.content.res.TypedArray; 218b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queruimport android.util.AttributeSet; 228b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queruimport static com.android.internal.R.styleable.AnticipateOvershootInterpolator_extraTension; 238b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queruimport static com.android.internal.R.styleable.AnticipateOvershootInterpolator_tension; 248b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queruimport static com.android.internal.R.styleable.AnticipateOvershootInterpolator; 258b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 268b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru/** 278b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * An interpolator where the change starts backward then flings forward and overshoots 288b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * the target value and finally goes back to the final value. 298b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru */ 308b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Querupublic class AnticipateOvershootInterpolator implements Interpolator { 318b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru private final float mTension; 328b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 338b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru public AnticipateOvershootInterpolator() { 348b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru mTension = 2.0f * 1.5f; 358b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } 368b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 378b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru /** 388b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * @param tension Amount of anticipation/overshoot. When tension equals 0.0f, 398b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * there is no anticipation/overshoot and the interpolator becomes 408b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * a simple acceleration/deceleration interpolator. 418b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru */ 428b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru public AnticipateOvershootInterpolator(float tension) { 438b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru mTension = tension * 1.5f; 448b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } 458b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 468b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru /** 478b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * @param tension Amount of anticipation/overshoot. When tension equals 0.0f, 488b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * there is no anticipation/overshoot and the interpolator becomes 498b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * a simple acceleration/deceleration interpolator. 508b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * @param extraTension Amount by which to multiply the tension. For instance, 518b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * to get the same overshoot as an OvershootInterpolator with 528b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru * a tension of 2.0f, you would use an extraTension of 1.5f. 538b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru */ 548b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru public AnticipateOvershootInterpolator(float tension, float extraTension) { 558b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru mTension = tension * extraTension; 568b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } 578b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 588b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru public AnticipateOvershootInterpolator(Context context, AttributeSet attrs) { 598b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru TypedArray a = context.obtainStyledAttributes(attrs, AnticipateOvershootInterpolator); 608b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 618b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru mTension = a.getFloat(AnticipateOvershootInterpolator_tension, 2.0f) * 628b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru a.getFloat(AnticipateOvershootInterpolator_extraTension, 1.5f); 638b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 648b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru a.recycle(); 658b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } 668b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 678b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru private static float a(float t, float s) { 688b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru return t * t * ((s + 1) * t - s); 698b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } 708b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 718b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru private static float o(float t, float s) { 728b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru return t * t * ((s + 1) * t + s); 738b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } 748b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 758b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru public float getInterpolation(float t) { 768b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru // a(t, s) = t * t * ((s + 1) * t - s) 778b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru // o(t, s) = t * t * ((s + 1) * t + s) 788b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru // f(t) = 0.5 * a(t * 2, tension * extraTension), when t < 0.5 798b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru // f(t) = 0.5 * (o(t * 2 - 2, tension * extraTension) + 2), when t <= 1.0 808b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru if (t < 0.5f) return 0.5f * a(t * 2.0f, mTension); 818b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru else return 0.5f * (o(t * 2.0f - 2.0f, mTension) + 2.0f); 828b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } 838b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru} 84