149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/* 249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Copyright (C) 2014 The Android Open Source Project 349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * you may not use this file except in compliance with the License. 649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * You may obtain a copy of the License at 749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 1049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * Unless required by applicable law or agreed to in writing, software 1149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 1249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * See the License for the specific language governing permissions and 1449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * limitations under the License. 1549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 1649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 1749c78900da0d43140fb602431fb93212bd7f6c70Chris Banespackage android.support.v7.internal.view; 1849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 1949c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorCompat; 2049c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListener; 2149c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.support.v4.view.ViewPropertyAnimatorListenerAdapter; 2249c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.View; 2349c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport android.view.animation.Interpolator; 2449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 2549c78900da0d43140fb602431fb93212bd7f6c70Chris Banesimport java.util.ArrayList; 2649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 2749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes/** 2855b8ae653ab9402efb19d6309155d18fbebb849eChris Banes * A very naive implementation of a set of 2955b8ae653ab9402efb19d6309155d18fbebb849eChris Banes * {@link android.support.v4.view.ViewPropertyAnimatorCompat}. 3049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * 3149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes * @hide 3249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes */ 3355b8ae653ab9402efb19d6309155d18fbebb849eChris Banespublic class ViewPropertyAnimatorCompatSet { 3449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 3549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final ArrayList<ViewPropertyAnimatorCompat> mAnimators; 3649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 3749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private long mDuration = -1; 3849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private Interpolator mInterpolator; 3949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private ViewPropertyAnimatorListener mListener; 4049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 4149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private boolean mIsStarted; 4249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 4355b8ae653ab9402efb19d6309155d18fbebb849eChris Banes public ViewPropertyAnimatorCompatSet() { 4449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mAnimators = new ArrayList<ViewPropertyAnimatorCompat>(); 4549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 4649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 4755b8ae653ab9402efb19d6309155d18fbebb849eChris Banes public ViewPropertyAnimatorCompatSet play(ViewPropertyAnimatorCompat animator) { 484c2a95906254748cb9a843b061288265d6e185a9Chris Banes if (!mIsStarted) { 494c2a95906254748cb9a843b061288265d6e185a9Chris Banes mAnimators.add(animator); 504c2a95906254748cb9a843b061288265d6e185a9Chris Banes } 514c2a95906254748cb9a843b061288265d6e185a9Chris Banes return this; 5249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 5349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 5449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void start() { 5549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mIsStarted) return; 5649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes for (ViewPropertyAnimatorCompat animator : mAnimators) { 5749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mDuration >= 0) { 5849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes animator.setDuration(mDuration); 5949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 6049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mInterpolator != null) { 6149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes animator.setInterpolator(mInterpolator); 6249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 6349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes if (mListener != null) { 6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes animator.setListener(mProxyListener); 6549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 6649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes animator.start(); 6749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 6949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mIsStarted = true; 7049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 7149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 729fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar private void onAnimationsEnded() { 739fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar mIsStarted = false; 749fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar } 759fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar 7649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void cancel() { 779fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar if (!mIsStarted) { 789fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar return; 799fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar } 8049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes for (ViewPropertyAnimatorCompat animator : mAnimators) { 8149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes animator.cancel(); 8249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 839fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar mIsStarted = false; 8449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 8549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 8655b8ae653ab9402efb19d6309155d18fbebb849eChris Banes public ViewPropertyAnimatorCompatSet setDuration(long duration) { 874c2a95906254748cb9a843b061288265d6e185a9Chris Banes if (!mIsStarted) { 884c2a95906254748cb9a843b061288265d6e185a9Chris Banes mDuration = duration; 894c2a95906254748cb9a843b061288265d6e185a9Chris Banes } 904c2a95906254748cb9a843b061288265d6e185a9Chris Banes return this; 9149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 9249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 9355b8ae653ab9402efb19d6309155d18fbebb849eChris Banes public ViewPropertyAnimatorCompatSet setInterpolator(Interpolator interpolator) { 944c2a95906254748cb9a843b061288265d6e185a9Chris Banes if (!mIsStarted) { 954c2a95906254748cb9a843b061288265d6e185a9Chris Banes mInterpolator = interpolator; 964c2a95906254748cb9a843b061288265d6e185a9Chris Banes } 974c2a95906254748cb9a843b061288265d6e185a9Chris Banes return this; 9849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 9949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 10055b8ae653ab9402efb19d6309155d18fbebb849eChris Banes public ViewPropertyAnimatorCompatSet setListener(ViewPropertyAnimatorListener listener) { 1014c2a95906254748cb9a843b061288265d6e185a9Chris Banes if (!mIsStarted) { 1024c2a95906254748cb9a843b061288265d6e185a9Chris Banes mListener = listener; 1034c2a95906254748cb9a843b061288265d6e185a9Chris Banes } 1044c2a95906254748cb9a843b061288265d6e185a9Chris Banes return this; 10549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 10649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 10749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes private final ViewPropertyAnimatorListenerAdapter mProxyListener 10849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes = new ViewPropertyAnimatorListenerAdapter() { 1099fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar private boolean mProxyStarted = false; 1109fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar private int mProxyEndCount = 0; 11149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 11249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 11349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationStart(View view) { 1149fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar if (mProxyStarted) { 1159fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar return; 1169fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar } 1179fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar mProxyStarted = true; 1189fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar if (mListener != null) { 11949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes mListener.onAnimationStart(null); 12049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 12149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 12249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes 1239fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar void onEnd() { 1249fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar mProxyEndCount = 0; 1259fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar mProxyStarted = false; 1269fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar onAnimationsEnded(); 1279fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar } 1289fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar 12949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes @Override 13049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes public void onAnimationEnd(View view) { 1319fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar if (++mProxyEndCount == mAnimators.size()) { 1329fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar if (mListener != null) { 1339fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar mListener.onAnimationEnd(null); 1349fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar } 1359fdc99636a0164602ccbdbfc468b38548b387853Yigit Boyar onEnd(); 13649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 13749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes } 13849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes }; 13949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes} 140