1631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes/* 2631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * Copyright (C) 2015 The Android Open Source Project 3631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * 4631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * you may not use this file except in compliance with the License. 6631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * You may obtain a copy of the License at 7631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * 8631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * http://www.apache.org/licenses/LICENSE-2.0 9631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * 10631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * Unless required by applicable law or agreed to in writing, software 11631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * See the License for the specific language governing permissions and 14631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * limitations under the License. 15631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes */ 16631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 17631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banespackage android.support.design.widget; 18631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 19631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banesimport android.view.animation.Interpolator; 20631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 21631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes/** 22631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * This class offers a very small subset of {@code ValueAnimator}'s API, but works pre-v11 too. 23631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * <p> 24631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * You shouldn't not instantiate this directly. Instead use {@code ViewUtils.createAnimator()}. 25631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes */ 26631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banesclass ValueAnimatorCompat { 27631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 28631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes interface AnimatorUpdateListener { 29631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes /** 30631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * <p>Notifies the occurrence of another frame of the animation.</p> 31631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * 32631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * @param animator The animation which was repeated. 33631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes */ 34631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes void onAnimationUpdate(ValueAnimatorCompat animator); 35631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 36631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 37631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes /** 38631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * An animation listener receives notifications from an animation. 39631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * Notifications indicate animation related events, such as the end or the 40631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * repetition of the animation. 41631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes */ 42631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes interface AnimatorListener { 43631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes /** 44631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * <p>Notifies the start of the animation.</p> 45631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * 46631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * @param animator The started animation. 47631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes */ 48631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes void onAnimationStart(ValueAnimatorCompat animator); 49631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes /** 50631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * <p>Notifies the end of the animation. This callback is not invoked 51631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * for animations with repeat count set to INFINITE.</p> 52631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * 53631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * @param animator The animation which reached its end. 54631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes */ 55631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes void onAnimationEnd(ValueAnimatorCompat animator); 56631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes /** 57631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * <p>Notifies the cancellation of the animation. This callback is not invoked 58631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * for animations with repeat count set to INFINITE.</p> 59631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * 60631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * @param animator The animation which was canceled. 61631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes */ 62631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes void onAnimationCancel(ValueAnimatorCompat animator); 63631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 64631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 65631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes static class AnimatorListenerAdapter implements AnimatorListener { 66631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes @Override 67631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void onAnimationStart(ValueAnimatorCompat animator) { 68631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 69631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 70631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes @Override 71631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void onAnimationEnd(ValueAnimatorCompat animator) { 72631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 73631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 74631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes @Override 75631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void onAnimationCancel(ValueAnimatorCompat animator) { 76631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 77631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 78631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 79631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes interface Creator { 80631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes ValueAnimatorCompat createAnimator(); 81631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 82631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 83631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes static abstract class Impl { 84631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes interface AnimatorUpdateListenerProxy { 85631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes void onAnimationUpdate(); 86631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 87631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 88631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes interface AnimatorListenerProxy { 89631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes void onAnimationStart(); 90631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes void onAnimationEnd(); 91631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes void onAnimationCancel(); 92631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 93631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 94631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract void start(); 95631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract boolean isRunning(); 96631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract void setInterpolator(Interpolator interpolator); 97631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract void setListener(AnimatorListenerProxy listener); 98631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract void setUpdateListener(AnimatorUpdateListenerProxy updateListener); 99631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract void setIntValues(int from, int to); 100631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract int getAnimatedIntValue(); 101631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract void setFloatValues(float from, float to); 102631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract float getAnimatedFloatValue(); 103e852801f9258e00f89da48918b58a6e933643ab9Aurimas Liutikas abstract void setDuration(long duration); 104631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract void cancel(); 105631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract float getAnimatedFraction(); 106631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes abstract void end(); 107ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes abstract long getDuration(); 108631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 109631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 110631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes private final Impl mImpl; 111631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 112631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes ValueAnimatorCompat(Impl impl) { 113631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl = impl; 114631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 115631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 116631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void start() { 117631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.start(); 118631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 119631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 120631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public boolean isRunning() { 121631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes return mImpl.isRunning(); 122631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 123631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 124631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void setInterpolator(Interpolator interpolator) { 125631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.setInterpolator(interpolator); 126631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 127631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 128631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void setUpdateListener(final AnimatorUpdateListener updateListener) { 129631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes if (updateListener != null) { 130631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.setUpdateListener(new Impl.AnimatorUpdateListenerProxy() { 131631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes @Override 132631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void onAnimationUpdate() { 133631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes updateListener.onAnimationUpdate(ValueAnimatorCompat.this); 134631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 135631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes }); 136631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } else { 137631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.setUpdateListener(null); 138631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 139631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 140631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 141631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void setListener(final AnimatorListener listener) { 142631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes if (listener != null) { 143631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.setListener(new Impl.AnimatorListenerProxy() { 144631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes @Override 145631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void onAnimationStart() { 146631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes listener.onAnimationStart(ValueAnimatorCompat.this); 147631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 148631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 149631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes @Override 150631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void onAnimationEnd() { 151631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes listener.onAnimationEnd(ValueAnimatorCompat.this); 152631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 153631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 154631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes @Override 155631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void onAnimationCancel() { 156631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes listener.onAnimationCancel(ValueAnimatorCompat.this); 157631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 158631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes }); 159631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } else { 160631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.setListener(null); 161631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 162631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 163631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 164631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void setIntValues(int from, int to) { 165631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.setIntValues(from, to); 166631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 167631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 168631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public int getAnimatedIntValue() { 169631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes return mImpl.getAnimatedIntValue(); 170631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 171631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 172631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void setFloatValues(float from, float to) { 173631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.setFloatValues(from, to); 174631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 175631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 176631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public float getAnimatedFloatValue() { 177631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes return mImpl.getAnimatedFloatValue(); 178631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 179631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 180e852801f9258e00f89da48918b58a6e933643ab9Aurimas Liutikas public void setDuration(long duration) { 181631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.setDuration(duration); 182631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 183631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 184631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void cancel() { 185631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.cancel(); 186631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 187631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 188631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public float getAnimatedFraction() { 189631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes return mImpl.getAnimatedFraction(); 190631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 191631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes 192631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes public void end() { 193631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes mImpl.end(); 194631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes } 195ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes 196ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes public long getDuration() { 197ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes return mImpl.getDuration(); 198ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes } 199631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes} 200