From a98fb7ab6a17d27395cf2c8e86060af49b861be6 Mon Sep 17 00:00:00 2001 From: George Mount Date: Thu, 24 Apr 2014 08:57:03 -0700 Subject: [PATCH] Add mechanism for Transitions to target a class. Bug 14289299 Added ability to target a specific class similarly to the mechanism for excluding a specific class in Transitions. Also changed XML tag from excludeTargetId to excludeId to make it symmetric with excludeClass. Change-Id: Ib371820ec75761243e75b659565b905b1b19c9a2 --- api/current.txt | 1 + core/java/android/transition/Transition.java | 54 +++++++++++++------ .../transition/TransitionInflater.java | 28 +++++----- core/res/res/values/attrs.xml | 2 + 4 files changed, 57 insertions(+), 28 deletions(-) diff --git a/api/current.txt b/api/current.txt index 20a9537eb6268..1ce792f5099b0 100644 --- a/api/current.txt +++ b/api/current.txt @@ -28026,6 +28026,7 @@ package android.transition { ctor public Transition(); method public android.transition.Transition addListener(android.transition.Transition.TransitionListener); method public android.transition.Transition addTarget(int); + method public android.transition.Transition addTarget(java.lang.Class); method public android.transition.Transition addTarget(android.view.View); method public boolean canRemoveViews(); method public abstract void captureEndValues(android.transition.TransitionValues); diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java index b93312bf2b54f..2549fde626348 100644 --- a/core/java/android/transition/Transition.java +++ b/core/java/android/transition/Transition.java @@ -88,8 +88,8 @@ import java.util.List; * transition uses a fadingMode of {@link Fade#OUT} instead of the default * out-in behavior. Finally, note the use of the targets sub-tag, which * takes a set of {@link android.R.styleable#TransitionTarget target} tags, each - * of which lists a specific targetId, excludeId, or - * excludeClass, which this transition acts upon. + * of which lists a specific targetId, targetClass, + * excludeId, or excludeClass, which this transition acts upon. * Use of targets is optional, but can be used to either limit the time spent checking * attributes on unchanging views, or limiting the types of animations run on specific views. * In this case, we know that only the grayscaleContainer will be @@ -116,6 +116,7 @@ public abstract class Transition implements Cloneable { ArrayList mTargetIdExcludes = null; ArrayList mTargetExcludes = null; ArrayList mTargetTypeExcludes = null; + ArrayList mTargetTypes = null; ArrayList mTargetIdChildExcludes = null; ArrayList mTargetChildExcludes = null; ArrayList mTargetTypeChildExcludes = null; @@ -569,19 +570,15 @@ public abstract class Transition implements Cloneable { } } } - if (mTargetIds.size() == 0 && mTargets.size() == 0) { + if (mTargetIds.size() == 0 && mTargets.size() == 0 && mTargetTypes == null) { return true; } - if (mTargetIds.size() > 0) { - for (int i = 0; i < mTargetIds.size(); ++i) { - if (mTargetIds.get(i) == targetId) { - return true; - } - } + if (mTargetIds.contains((int) targetId) || mTargets.contains(target)) { + return true; } - if (target != null && mTargets.size() > 0) { - for (int i = 0; i < mTargets.size(); ++i) { - if (mTargets.get(i) == target) { + if (mTargetTypes != null) { + for (int i = 0; i < mTargetTypes.size(); ++i) { + if (mTargetTypes.get(i).isInstance(target)) { return true; } } @@ -726,6 +723,36 @@ public abstract class Transition implements Cloneable { return this; } + /** + * Adds the Class of a target view that this Transition is interested in + * animating. By default, there are no targetTypes, and a Transition will + * listen for changes on every view in the hierarchy below the sceneRoot + * of the Scene being transitioned into. Setting targetTypes constrains + * the Transition to only listen for, and act on, views with these classes. + * Views with different classes will be ignored. + * + *

Note that any View that can be cast to targetType will be included, so + * if targetType is View.class, all Views will be included.

+ * + * @see #addTarget(int) + * @see #addTarget(android.view.View) + * @see #excludeTarget(Class, boolean) + * @see #excludeChildren(Class, boolean) + * + * @param targetType The type to include when running this transition. + * @return The Transition to which the target class was added. + * Returning the same object makes it easier to chain calls during + * construction, such as + * transitionSet.addTransitions(new Fade()).addTarget(ImageView.class); + */ + public Transition addTarget(Class targetType) { + if (mTargetTypes == null) { + mTargetTypes = new ArrayList(); + } + mTargetTypes.add(targetType); + return this; + } + /** * Removes the given targetId from the list of ids that this Transition * is interested in animating. @@ -1116,9 +1143,6 @@ public abstract class Transition implements Cloneable { if (view == null) { return; } - if (!isValidTarget(view, view.getId())) { - return; - } boolean isListViewItem = false; if (view.getParent() instanceof ListView) { isListViewItem = true; diff --git a/core/java/android/transition/TransitionInflater.java b/core/java/android/transition/TransitionInflater.java index 2bdba81f5bf7e..a5e960aa4d9f2 100644 --- a/core/java/android/transition/TransitionInflater.java +++ b/core/java/android/transition/TransitionInflater.java @@ -231,22 +231,24 @@ public class TransitionInflater { com.android.internal.R.styleable.TransitionTarget_targetId, -1); if (id >= 0) { transition.addTarget(id); + } else if ((id = a.getResourceId( + com.android.internal.R.styleable.TransitionTarget_excludeId, -1)) >= 0) { + transition.excludeTarget(id, true); } else { - id = a.getResourceId( - com.android.internal.R.styleable.TransitionTarget_excludeId, -1); - if (id >= 0) { - transition.excludeTarget(id, true); - } else { - String className = a.getString( - com.android.internal.R.styleable.TransitionTarget_excludeClass); + String className = a.getString( + com.android.internal.R.styleable.TransitionTarget_excludeClass); + try { if (className != null) { - try { - Class clazz = Class.forName(className); - transition.excludeTarget(clazz, true); - } catch (ClassNotFoundException e) { - throw new RuntimeException("Could not create " + className, e); - } + Class clazz = Class.forName(className); + transition.excludeTarget(clazz, true); + } else if ((className = a.getString( + com.android.internal.R.styleable.TransitionTarget_targetClass)) + != null) { + Class clazz = Class.forName(className); + transition.addTarget(clazz); } + } catch (ClassNotFoundException e) { + throw new RuntimeException("Could not create " + className, e); } } } else { diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 0a3ca2a1bccea..efc1b55bf005b 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -5029,6 +5029,8 @@ + +