1 package com.airbnb.lottie.utils; 2 3 import android.animation.Animator; 4 import android.animation.TimeInterpolator; 5 import android.animation.ValueAnimator; 6 import android.os.Build; 7 8 import java.util.Set; 9 import java.util.concurrent.CopyOnWriteArraySet; 10 11 public abstract class BaseLottieAnimator extends ValueAnimator { 12 private final Set<ValueAnimator.AnimatorUpdateListener> updateListeners = new CopyOnWriteArraySet<>(); 13 private final Set<AnimatorListener> listeners = new CopyOnWriteArraySet<>(); 14 getStartDelay()15 @Override public long getStartDelay() { 16 throw new UnsupportedOperationException("LottieAnimator does not support getStartDelay."); 17 } 18 setStartDelay(long startDelay)19 @Override public void setStartDelay(long startDelay) { 20 throw new UnsupportedOperationException("LottieAnimator does not support setStartDelay."); 21 } 22 setDuration(long duration)23 @Override public ValueAnimator setDuration(long duration) { 24 throw new UnsupportedOperationException("LottieAnimator does not support setDuration."); 25 } 26 setInterpolator(TimeInterpolator value)27 @Override public void setInterpolator(TimeInterpolator value) { 28 throw new UnsupportedOperationException("LottieAnimator does not support setInterpolator."); 29 } 30 addUpdateListener(ValueAnimator.AnimatorUpdateListener listener)31 public void addUpdateListener(ValueAnimator.AnimatorUpdateListener listener) { 32 updateListeners.add(listener); 33 } 34 removeUpdateListener(ValueAnimator.AnimatorUpdateListener listener)35 public void removeUpdateListener(ValueAnimator.AnimatorUpdateListener listener) { 36 updateListeners.remove(listener); 37 } 38 removeAllUpdateListeners()39 public void removeAllUpdateListeners() { 40 updateListeners.clear(); 41 } 42 addListener(Animator.AnimatorListener listener)43 public void addListener(Animator.AnimatorListener listener) { 44 listeners.add(listener); 45 } 46 removeListener(Animator.AnimatorListener listener)47 public void removeListener(Animator.AnimatorListener listener) { 48 listeners.remove(listener); 49 } 50 removeAllListeners()51 public void removeAllListeners() { 52 listeners.clear(); 53 } 54 notifyStart(boolean isReverse)55 void notifyStart(boolean isReverse) { 56 for (Animator.AnimatorListener listener : listeners) { 57 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 58 listener.onAnimationStart(this, isReverse); 59 } else { 60 listener.onAnimationStart(this); 61 } 62 } 63 } 64 notifyRepeat()65 void notifyRepeat() { 66 for (Animator.AnimatorListener listener : listeners) { 67 listener.onAnimationRepeat(this); 68 } 69 } 70 notifyEnd(boolean isReverse)71 void notifyEnd(boolean isReverse) { 72 for (Animator.AnimatorListener listener : listeners) { 73 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 74 listener.onAnimationEnd(this, isReverse); 75 } else { 76 listener.onAnimationEnd(this); 77 } 78 } 79 } 80 notifyCancel()81 void notifyCancel() { 82 for (Animator.AnimatorListener listener : listeners) { 83 listener.onAnimationCancel(this); 84 } 85 } 86 notifyUpdate()87 void notifyUpdate() { 88 for (ValueAnimator.AnimatorUpdateListener listener : updateListeners) { 89 listener.onAnimationUpdate(this); 90 } 91 } 92 } 93