summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorztenghui <ztenghui@google.com>2015-03-24 14:11:37 -0700
committerztenghui <ztenghui@google.com>2015-03-24 15:49:13 -0700
commit1588f0ff54b88240b55eeaba97e67f0f1dee5f92 (patch)
tree2f9ab06c201b4d4717ab46111f3efa2e69451da3
parent111928fa324db73f94389bdfab4b108cbd30d8f4 (diff)
downloadframeworks_base-1588f0ff54b88240b55eeaba97e67f0f1dee5f92.zip
frameworks_base-1588f0ff54b88240b55eeaba97e67f0f1dee5f92.tar.gz
frameworks_base-1588f0ff54b88240b55eeaba97e67f0f1dee5f92.tar.bz2
Add listener support in AVD
Internally, switch to use AnimatorSet instead of an array of Animators b/19825918 Change-Id: Ia67d2cc7dd89362e6b0019c916d3f2a0d0f3e39e
-rw-r--r--api/current.txt3
-rw-r--r--api/system-current.txt3
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java131
-rw-r--r--tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java23
4 files changed, 100 insertions, 60 deletions
diff --git a/api/current.txt b/api/current.txt
index d8d8998..5ef566d 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11896,9 +11896,12 @@ package android.graphics.drawable {
public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable {
ctor public AnimatedVectorDrawable();
+ method public void addListener(android.animation.Animator.AnimatorListener);
method public void draw(android.graphics.Canvas);
+ method public java.util.List<android.animation.Animator.AnimatorListener> getListeners();
method public int getOpacity();
method public boolean isRunning();
+ method public void removeListener(android.animation.Animator.AnimatorListener);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
method public void start();
diff --git a/api/system-current.txt b/api/system-current.txt
index 71474a3..d4a7ff6 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -12176,9 +12176,12 @@ package android.graphics.drawable {
public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable {
ctor public AnimatedVectorDrawable();
+ method public void addListener(android.animation.Animator.AnimatorListener);
method public void draw(android.graphics.Canvas);
+ method public java.util.List<android.animation.Animator.AnimatorListener> getListeners();
method public int getOpacity();
method public boolean isRunning();
+ method public void removeListener(android.animation.Animator.AnimatorListener);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
method public void start();
diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
index 17e5b0b..db489f6 100644
--- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
@@ -16,6 +16,8 @@ package android.graphics.drawable;
import android.animation.Animator;
import android.animation.AnimatorInflater;
+import android.animation.AnimatorSet;
+import android.animation.Animator.AnimatorListener;
import android.annotation.NonNull;
import android.content.res.ColorStateList;
import android.content.res.Resources;
@@ -37,6 +39,7 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.List;
/**
* This class uses {@link android.animation.ObjectAnimator} and
@@ -312,6 +315,15 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
eventType = parser.next();
}
+ setupAnimatorSet();
+ }
+
+ private void setupAnimatorSet() {
+ if (mAnimatedVectorState.mTempAnimators != null) {
+ mAnimatedVectorState.mAnimatorSet.playTogether(mAnimatedVectorState.mTempAnimators);
+ mAnimatedVectorState.mTempAnimators.clear();
+ mAnimatedVectorState.mTempAnimators = null;
+ }
}
@Override
@@ -330,10 +342,44 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
}
}
+ /**
+ * Adds a listener to the set of listeners that are sent events through the life of an
+ * animation.
+ *
+ * @param listener the listener to be added to the current set of listeners for this animation.
+ */
+ public void addListener(AnimatorListener listener) {
+ mAnimatedVectorState.mAnimatorSet.addListener(listener);
+ }
+
+ /**
+ * Removes a listener from the set listening to this animation.
+ *
+ * @param listener the listener to be removed from the current set of listeners for this
+ * animation.
+ */
+ public void removeListener(AnimatorListener listener) {
+ mAnimatedVectorState.mAnimatorSet.removeListener(listener);
+ }
+
+ /**
+ * Gets the set of {@link android.animation.Animator.AnimatorListener} objects that are currently
+ * listening for events on this <code>AnimatedVectorDrawable</code> object.
+ *
+ * @return List<AnimatorListener> The set of listeners.
+ */
+ public List<AnimatorListener> getListeners() {
+ return mAnimatedVectorState.mAnimatorSet.getListeners();
+ }
+
private static class AnimatedVectorDrawableState extends ConstantState {
int mChangingConfigurations;
VectorDrawable mVectorDrawable;
- ArrayList<Animator> mAnimators;
+ // Always have a valid animatorSet to handle all the listeners call.
+ AnimatorSet mAnimatorSet = new AnimatorSet();
+ // When parsing the XML, we build individual animator and store in this array. At the end,
+ // we add this array into the mAnimatorSet.
+ private ArrayList<Animator> mTempAnimators;
ArrayMap<Animator, String> mTargetNameMap;
public AnimatedVectorDrawableState(AnimatedVectorDrawableState copy,
@@ -353,18 +399,23 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
mVectorDrawable.setBounds(copy.mVectorDrawable.getBounds());
mVectorDrawable.setAllowCaching(false);
}
- if (copy.mAnimators != null) {
- final int numAnimators = copy.mAnimators.size();
- mAnimators = new ArrayList<Animator>(numAnimators);
+ if (copy.mAnimatorSet != null) {
+ final int numAnimators = copy.mTargetNameMap.size();
+ // Deep copy a animator set, and then setup the target map again.
+ mAnimatorSet = copy.mAnimatorSet.clone();
mTargetNameMap = new ArrayMap<Animator, String>(numAnimators);
+ // Since the new AnimatorSet is cloned from the old one, the order must be the
+ // same inside the array.
+ ArrayList<Animator> oldAnim = copy.mAnimatorSet.getChildAnimations();
+ ArrayList<Animator> newAnim = mAnimatorSet.getChildAnimations();
+
for (int i = 0; i < numAnimators; ++i) {
- Animator anim = copy.mAnimators.get(i);
- Animator animClone = anim.clone();
- String targetName = copy.mTargetNameMap.get(anim);
- Object targetObject = mVectorDrawable.getTargetByName(targetName);
- animClone.setTarget(targetObject);
- mAnimators.add(animClone);
- mTargetNameMap.put(animClone, targetName);
+ // Target name must be the same for new and old
+ String targetName = copy.mTargetNameMap.get(oldAnim.get(i));
+
+ Object newTargetObject = mVectorDrawable.getTargetByName(targetName);
+ newAnim.get(i).setTarget(newTargetObject);
+ mTargetNameMap.put(newAnim.get(i), targetName);
}
}
} else {
@@ -397,11 +448,11 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
private void setupAnimatorsForTarget(String name, Animator animator) {
Object target = mAnimatedVectorState.mVectorDrawable.getTargetByName(name);
animator.setTarget(target);
- if (mAnimatedVectorState.mAnimators == null) {
- mAnimatedVectorState.mAnimators = new ArrayList<Animator>();
+ if (mAnimatedVectorState.mTempAnimators == null) {
+ mAnimatedVectorState.mTempAnimators = new ArrayList<Animator>();
mAnimatedVectorState.mTargetNameMap = new ArrayMap<Animator, String>();
}
- mAnimatedVectorState.mAnimators.add(animator);
+ mAnimatedVectorState.mTempAnimators.add(animator);
mAnimatedVectorState.mTargetNameMap.put(animator, name);
if (DBG_ANIMATION_VECTOR_DRAWABLE) {
Log.v(LOGTAG, "add animator for target " + name + " " + animator);
@@ -410,27 +461,11 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
@Override
public boolean isRunning() {
- final ArrayList<Animator> animators = mAnimatedVectorState.mAnimators;
- final int size = animators.size();
- for (int i = 0; i < size; i++) {
- final Animator animator = animators.get(i);
- if (animator.isRunning()) {
- return true;
- }
- }
- return false;
+ return mAnimatedVectorState.mAnimatorSet.isRunning();
}
private boolean isStarted() {
- final ArrayList<Animator> animators = mAnimatedVectorState.mAnimators;
- final int size = animators.size();
- for (int i = 0; i < size; i++) {
- final Animator animator = animators.get(i);
- if (animator.isStarted()) {
- return true;
- }
- }
- return false;
+ return mAnimatedVectorState.mAnimatorSet.isStarted();
}
@Override
@@ -439,24 +474,13 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
if (isStarted()) {
return;
}
- // Otherwise, kick off every animator.
- final ArrayList<Animator> animators = mAnimatedVectorState.mAnimators;
- final int size = animators.size();
- for (int i = 0; i < size; i++) {
- final Animator animator = animators.get(i);
- animator.start();
- }
+ mAnimatedVectorState.mAnimatorSet.start();
invalidateSelf();
}
@Override
public void stop() {
- final ArrayList<Animator> animators = mAnimatedVectorState.mAnimators;
- final int size = animators.size();
- for (int i = 0; i < size; i++) {
- final Animator animator = animators.get(i);
- animator.end();
- }
+ mAnimatedVectorState.mAnimatorSet.end();
}
/**
@@ -473,27 +497,14 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
Log.w(LOGTAG, "AnimatedVectorDrawable can't reverse()");
return;
}
- final ArrayList<Animator> animators = mAnimatedVectorState.mAnimators;
- final int size = animators.size();
- for (int i = 0; i < size; i++) {
- final Animator animator = animators.get(i);
- animator.reverse();
- }
+ mAnimatedVectorState.mAnimatorSet.reverse();
}
/**
* @hide
*/
public boolean canReverse() {
- final ArrayList<Animator> animators = mAnimatedVectorState.mAnimators;
- final int size = animators.size();
- for (int i = 0; i < size; i++) {
- final Animator animator = animators.get(i);
- if (!animator.canReverse()) {
- return false;
- }
- }
- return true;
+ return mAnimatedVectorState.mAnimatorSet.canReverse();
}
private final Callback mCallback = new Callback() {
diff --git a/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java b/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java
index ecc7782..56c8119 100644
--- a/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java
+++ b/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java
@@ -14,9 +14,12 @@
package com.android.test.dynamic;
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
import android.app.Activity;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.os.Bundle;
+import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.GridLayout;
@@ -52,6 +55,26 @@ public class AnimatedVectorDrawableTest extends Activity implements View.OnClick
button.setWidth(400);
button.setHeight(400);
button.setBackgroundResource(icon[i]);
+ AnimatedVectorDrawable d = (AnimatedVectorDrawable) button.getBackground();
+ d.addListener(new AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ Log.v(LOGCAT, "Animator start");
+ }
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ Log.v(LOGCAT, "Animator repeat");
+ }
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ Log.v(LOGCAT, "Animator end");
+ }
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ Log.v(LOGCAT, "Animator cancel");
+ }
+ });
+
container.addView(button);
button.setOnClickListener(this);
}