1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.support.v7.internal.view; 18 19import android.support.v4.view.ViewPropertyAnimatorCompat; 20import android.support.v4.view.ViewPropertyAnimatorListener; 21import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; 22import android.view.View; 23import android.view.animation.Interpolator; 24 25import java.util.ArrayList; 26 27/** 28 * A very naive implementation of a set of 29 * {@link android.support.v4.view.ViewPropertyAnimatorCompat}. 30 * 31 * @hide 32 */ 33public class ViewPropertyAnimatorCompatSet { 34 35 private final ArrayList<ViewPropertyAnimatorCompat> mAnimators; 36 37 private long mDuration = -1; 38 private Interpolator mInterpolator; 39 private ViewPropertyAnimatorListener mListener; 40 41 private boolean mIsStarted; 42 43 public ViewPropertyAnimatorCompatSet() { 44 mAnimators = new ArrayList<ViewPropertyAnimatorCompat>(); 45 } 46 47 public ViewPropertyAnimatorCompatSet play(ViewPropertyAnimatorCompat animator) { 48 if (!mIsStarted) { 49 mAnimators.add(animator); 50 } 51 return this; 52 } 53 54 public void start() { 55 if (mIsStarted) return; 56 for (ViewPropertyAnimatorCompat animator : mAnimators) { 57 if (mDuration >= 0) { 58 animator.setDuration(mDuration); 59 } 60 if (mInterpolator != null) { 61 animator.setInterpolator(mInterpolator); 62 } 63 if (mListener != null) { 64 animator.setListener(mProxyListener); 65 } 66 animator.start(); 67 } 68 69 mIsStarted = true; 70 } 71 72 private void onAnimationsEnded() { 73 mIsStarted = false; 74 } 75 76 public void cancel() { 77 if (!mIsStarted) { 78 return; 79 } 80 for (ViewPropertyAnimatorCompat animator : mAnimators) { 81 animator.cancel(); 82 } 83 mIsStarted = false; 84 } 85 86 public ViewPropertyAnimatorCompatSet setDuration(long duration) { 87 if (!mIsStarted) { 88 mDuration = duration; 89 } 90 return this; 91 } 92 93 public ViewPropertyAnimatorCompatSet setInterpolator(Interpolator interpolator) { 94 if (!mIsStarted) { 95 mInterpolator = interpolator; 96 } 97 return this; 98 } 99 100 public ViewPropertyAnimatorCompatSet setListener(ViewPropertyAnimatorListener listener) { 101 if (!mIsStarted) { 102 mListener = listener; 103 } 104 return this; 105 } 106 107 private final ViewPropertyAnimatorListenerAdapter mProxyListener 108 = new ViewPropertyAnimatorListenerAdapter() { 109 private boolean mProxyStarted = false; 110 private int mProxyEndCount = 0; 111 112 @Override 113 public void onAnimationStart(View view) { 114 if (mProxyStarted) { 115 return; 116 } 117 mProxyStarted = true; 118 if (mListener != null) { 119 mListener.onAnimationStart(null); 120 } 121 } 122 123 void onEnd() { 124 mProxyEndCount = 0; 125 mProxyStarted = false; 126 onAnimationsEnded(); 127 } 128 129 @Override 130 public void onAnimationEnd(View view) { 131 if (++mProxyEndCount == mAnimators.size()) { 132 if (mListener != null) { 133 mListener.onAnimationEnd(null); 134 } 135 onEnd(); 136 } 137 } 138 }; 139} 140