diff options
author | George Mount <mount@google.com> | 2014-04-24 08:57:03 -0700 |
---|---|---|
committer | George Mount <mount@google.com> | 2014-04-29 13:08:39 -0700 |
commit | a98fb7ab6a17d27395cf2c8e86060af49b861be6 (patch) | |
tree | 8d28d14b53f1d245855081dc7dd2fd3da0efd7dd | |
parent | caa03107d4322b0e30f92e6dc1eb1ea73b1bf747 (diff) | |
download | frameworks_base-a98fb7ab6a17d27395cf2c8e86060af49b861be6.zip frameworks_base-a98fb7ab6a17d27395cf2c8e86060af49b861be6.tar.gz frameworks_base-a98fb7ab6a17d27395cf2c8e86060af49b861be6.tar.bz2 |
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
-rw-r--r-- | api/current.txt | 1 | ||||
-rw-r--r-- | core/java/android/transition/Transition.java | 54 | ||||
-rw-r--r-- | core/java/android/transition/TransitionInflater.java | 28 | ||||
-rw-r--r-- | 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 20a9537..1ce792f 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 b93312b..2549fde 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 <code>targets</code> sub-tag, which * takes a set of {@link android.R.styleable#TransitionTarget target} tags, each - * of which lists a specific <code>targetId</code>, <code>excludeId</code>, or - * <code>excludeClass</code>, which this transition acts upon. + * of which lists a specific <code>targetId</code>, <code>targetClass</code>, + * <code>excludeId</code>, or <code>excludeClass</code>, 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 <code>grayscaleContainer</code> will be @@ -116,6 +116,7 @@ public abstract class Transition implements Cloneable { ArrayList<Integer> mTargetIdExcludes = null; ArrayList<View> mTargetExcludes = null; ArrayList<Class> mTargetTypeExcludes = null; + ArrayList<Class> mTargetTypes = null; ArrayList<Integer> mTargetIdChildExcludes = null; ArrayList<View> mTargetChildExcludes = null; ArrayList<Class> 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; } } @@ -727,6 +724,36 @@ public abstract class Transition implements Cloneable { } /** + * 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. + * + * <p>Note that any View that can be cast to targetType will be included, so + * if targetType is <code>View.class</code>, all Views will be included.</p> + * + * @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 + * <code>transitionSet.addTransitions(new Fade()).addTarget(ImageView.class);</code> + */ + public Transition addTarget(Class targetType) { + if (mTargetTypes == null) { + mTargetTypes = new ArrayList<Class>(); + } + 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 2bdba81..a5e960a 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 0a3ca2a..efc1b55 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -5029,6 +5029,8 @@ <attr name="excludeId" format="reference" /> <!-- The fully-qualified name of the Class to exclude from this transition. --> <attr name="excludeClass" format="string" /> + <!-- The fully-qualified name of the Class to include in this transition. --> + <attr name="targetClass" /> </declare-styleable> <!-- Use <code>set</code> as the root tag of the XML resource that |