Change animator xml importing to use new inflater class
Change-Id: I97225ee9868f4dcce5e4c1ba55e16414eb6c0464
diff --git a/api/current.xml b/api/current.xml
index cbbf3d1..8ff263c 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -19966,6 +19966,40 @@
</parameter>
</method>
</interface>
+<class name="AnimatableInflater"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="AnimatableInflater"
+ type="android.animation.AnimatableInflater"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="loadAnimatable"
+ return="android.animation.Animatable"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="id" type="int">
+</parameter>
+<exception name="Resources.NotFoundException" type="android.content.res.Resources.NotFoundException">
+</exception>
+</method>
+</class>
<class name="AnimatableListenerAdapter"
extends="java.lang.Object"
abstract="true"
@@ -20052,10 +20086,6 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="attrs" type="android.util.AttributeSet">
-</parameter>
</constructor>
<constructor name="Animator"
type="android.animation.Animator"
@@ -20231,6 +20261,19 @@
<parameter name="playTime" type="long">
</parameter>
</method>
+<method name="setDuration"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="duration" type="long">
+</parameter>
+</method>
<method name="setEvaluator"
return="void"
abstract="false"
@@ -20653,10 +20696,6 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="attrs" type="android.util.AttributeSet">
-</parameter>
</constructor>
<constructor name="PropertyAnimator"
type="android.animation.PropertyAnimator"
@@ -205789,23 +205828,6 @@
<exception name="Resources.NotFoundException" type="android.content.res.Resources.NotFoundException">
</exception>
</method>
-<method name="loadAnimator"
- return="android.animation.Animatable"
- abstract="false"
- native="false"
- synchronized="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="id" type="int">
-</parameter>
-<exception name="Resources.NotFoundException" type="android.content.res.Resources.NotFoundException">
-</exception>
-</method>
<method name="loadInterpolator"
return="android.view.animation.Interpolator"
abstract="false"
diff --git a/core/java/android/animation/AnimatableInflater.java b/core/java/android/animation/AnimatableInflater.java
new file mode 100644
index 0000000..88fa77e
--- /dev/null
+++ b/core/java/android/animation/AnimatableInflater.java
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.animation;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.content.res.Resources.NotFoundException;
+import android.util.AttributeSet;
+import android.util.Xml;
+import android.view.animation.AnimationUtils;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * This class is used to instantiate menu XML files into Animatable objects.
+ * <p>
+ * For performance reasons, menu inflation relies heavily on pre-processing of
+ * XML files that is done at build time. Therefore, it is not currently possible
+ * to use MenuInflater with an XmlPullParser over a plain XML file at runtime;
+ * it only works with an XmlPullParser returned from a compiled resource (R.
+ * <em>something</em> file.)
+ */
+public class AnimatableInflater {
+
+ /**
+ * These flags are used when parsing Sequencer objects
+ */
+ private static final int TOGETHER = 0;
+ private static final int SEQUENTIALLY = 1;
+
+ /**
+ * Enum values used in XML attributes to indicate the value for mValueType
+ */
+ private static final int VALUE_TYPE_FLOAT = 0;
+ private static final int VALUE_TYPE_INT = 1;
+ private static final int VALUE_TYPE_DOUBLE = 2;
+ private static final int VALUE_TYPE_COLOR = 3;
+ private static final int VALUE_TYPE_CUSTOM = 4;
+
+ /**
+ * Loads an {@link Animatable} object from a resource
+ *
+ * @param context Application context used to access resources
+ * @param id The resource id of the animation to load
+ * @return The animatable object reference by the specified id
+ * @throws android.content.res.Resources.NotFoundException when the animation cannot be loaded
+ */
+ public static Animatable loadAnimatable(Context context, int id)
+ throws NotFoundException {
+
+ XmlResourceParser parser = null;
+ try {
+ parser = context.getResources().getAnimation(id);
+ return createAnimatableFromXml(context, parser);
+ } catch (XmlPullParserException ex) {
+ Resources.NotFoundException rnf =
+ new Resources.NotFoundException("Can't load animation resource ID #0x" +
+ Integer.toHexString(id));
+ rnf.initCause(ex);
+ throw rnf;
+ } catch (IOException ex) {
+ Resources.NotFoundException rnf =
+ new Resources.NotFoundException("Can't load animation resource ID #0x" +
+ Integer.toHexString(id));
+ rnf.initCause(ex);
+ throw rnf;
+ } finally {
+ if (parser != null) parser.close();
+ }
+ }
+
+ private static Animatable createAnimatableFromXml(Context c, XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+
+ return createAnimatableFromXml(c, parser, Xml.asAttributeSet(parser), null, 0);
+ }
+
+ private static Animatable createAnimatableFromXml(Context c, XmlPullParser parser,
+ AttributeSet attrs, Sequencer parent, int sequenceOrdering)
+ throws XmlPullParserException, IOException {
+
+ Animatable anim = null;
+ ArrayList<Animatable> childAnims = null;
+
+ // Make sure we are on a start tag.
+ int type;
+ int depth = parser.getDepth();
+
+ while (((type=parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth)
+ && type != XmlPullParser.END_DOCUMENT) {
+
+ if (type != XmlPullParser.START_TAG) {
+ continue;
+ }
+
+ String name = parser.getName();
+
+ if (name.equals("property")) {
+ anim = loadPropertyAnimator(c, attrs);
+ } else if (name.equals("animator")) {
+ anim = loadAnimator(c, attrs, null);
+ } else if (name.equals("sequencer")) {
+ anim = new Sequencer();
+ TypedArray a = c.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.Sequencer);
+ int ordering = a.getInt(com.android.internal.R.styleable.Sequencer_ordering,
+ TOGETHER);
+ createAnimatableFromXml(c, parser, attrs, (Sequencer) anim, ordering);
+ a.recycle();
+ } else {
+ throw new RuntimeException("Unknown animator name: " + parser.getName());
+ }
+
+ if (parent != null) {
+ if (childAnims == null) {
+ childAnims = new ArrayList<Animatable>();
+ }
+ childAnims.add(anim);
+ }
+ }
+ if (parent != null && childAnims != null) {
+ Animatable[] animsArray = new Animatable[childAnims.size()];
+ int index = 0;
+ for (Animatable a : childAnims) {
+ animsArray[index++] = a;
+ }
+ if (sequenceOrdering == TOGETHER) {
+ parent.playTogether(animsArray);
+ } else {
+ parent.playSequentially(animsArray);
+ }
+ }
+
+ return anim;
+
+ }
+
+ private static PropertyAnimator loadPropertyAnimator(Context context, AttributeSet attrs)
+ throws NotFoundException {
+
+ PropertyAnimator anim = new PropertyAnimator();
+
+ loadAnimator(context, attrs, anim);
+
+ TypedArray a =
+ context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.PropertyAnimator);
+
+ String propertyName = a.getString(com.android.internal.R.styleable.PropertyAnimator_propertyName);
+
+ anim.setPropertyName(propertyName);
+
+ a.recycle();
+
+ return anim;
+ }
+
+ /**
+ * Creates a new animation whose parameters come from the specified context and
+ * attributes set.
+ *
+ * @param context the application environment
+ * @param attrs the set of attributes holding the animation parameters
+ */
+ private static Animator loadAnimator(Context context, AttributeSet attrs, Animator anim)
+ throws NotFoundException {
+
+ TypedArray a =
+ context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Animator);
+
+ long duration = a.getInt(com.android.internal.R.styleable.Animator_duration, 0);
+
+ long startDelay = a.getInt(com.android.internal.R.styleable.Animator_startOffset, 0);
+
+ int valueType = a.getInt(com.android.internal.R.styleable.Animator_valueType,
+ VALUE_TYPE_FLOAT);
+
+ Object valueFrom = null;
+ Object valueTo = null;
+ TypeEvaluator evaluator = null;
+
+ switch (valueType) {
+ case VALUE_TYPE_FLOAT:
+ if (a.hasValue(com.android.internal.R.styleable.Animator_valueFrom)) {
+ valueFrom = a.getFloat(com.android.internal.R.styleable.Animator_valueFrom, 0f);
+ }
+ if (a.hasValue(com.android.internal.R.styleable.Animator_valueTo)) {
+ valueTo = a.getFloat(com.android.internal.R.styleable.Animator_valueTo, 0f);
+ }
+ break;
+ case VALUE_TYPE_COLOR:
+ evaluator = new RGBEvaluator();
+ // fall through to pick up values
+ case VALUE_TYPE_INT:
+ if (a.hasValue(com.android.internal.R.styleable.Animator_valueFrom)) {
+ valueFrom = a.getInteger(com.android.internal.R.styleable.Animator_valueFrom, 0);
+ }
+ if (a.hasValue(com.android.internal.R.styleable.Animator_valueTo)) {
+ valueTo = a.getInteger(com.android.internal.R.styleable.Animator_valueTo, 0);
+ }
+ break;
+ case VALUE_TYPE_DOUBLE:
+ if (a.hasValue(com.android.internal.R.styleable.Animator_valueFrom)) {
+ valueFrom = (Double)((Float)(a.getFloat(com.android.internal.R.styleable.Animator_valueFrom, 0f))).doubleValue();
+ }
+ if (a.hasValue(com.android.internal.R.styleable.Animator_valueTo)) {
+ valueTo = (Double)((Float)a.getFloat(com.android.internal.R.styleable.Animator_valueTo, 0f)).doubleValue();
+ }
+ break;
+ case VALUE_TYPE_CUSTOM:
+ // TODO: How to get an 'Object' value?
+ if (a.hasValue(com.android.internal.R.styleable.Animator_valueFrom)) {
+ valueFrom = a.getFloat(com.android.internal.R.styleable.Animator_valueFrom, 0f);
+ }
+ if (a.hasValue(com.android.internal.R.styleable.Animator_valueTo)) {
+ valueTo = a.getFloat(com.android.internal.R.styleable.Animator_valueTo, 0f);
+ }
+ break;
+ }
+
+ if (anim == null) {
+ anim = new Animator(duration, valueFrom, valueTo);
+ } else {
+ anim.setDuration(duration);
+ anim.setValues(valueFrom, valueTo);
+ }
+
+ anim.setStartDelay(startDelay);
+
+ if (a.hasValue(com.android.internal.R.styleable.Animator_repeatCount)) {
+ anim.setRepeatCount(
+ a.getInt(com.android.internal.R.styleable.Animator_repeatCount, 0));
+ }
+ if (a.hasValue(com.android.internal.R.styleable.Animator_repeatMode)) {
+ anim.setRepeatMode(
+ a.getInt(com.android.internal.R.styleable.Animator_repeatMode,
+ Animator.RESTART));
+ }
+ if (evaluator != null) {
+ anim.setEvaluator(evaluator);
+ }
+
+ final int resID =
+ a.getResourceId(com.android.internal.R.styleable.Animator_interpolator, 0);
+ if (resID > 0) {
+ anim.setInterpolator(AnimationUtils.loadInterpolator(context, resID));
+ }
+ a.recycle();
+
+ return anim;
+ }
+}
diff --git a/core/java/android/animation/Animator.java b/core/java/android/animation/Animator.java
index eca5f0d..18017ba 100755
--- a/core/java/android/animation/Animator.java
+++ b/core/java/android/animation/Animator.java
@@ -17,11 +17,9 @@
package android.animation;
import android.content.Context;
-import android.content.res.TypedArray;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.util.AttributeSet;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
@@ -70,15 +68,6 @@
private static final int SEEKED = 4; // Seeked to some time value
/**
- * Enum values used in XML attributes to indicate the value for mValueType
- */
- private static final int VALUE_TYPE_FLOAT = 0;
- private static final int VALUE_TYPE_INT = 1;
- private static final int VALUE_TYPE_DOUBLE = 2;
- private static final int VALUE_TYPE_COLOR = 3;
- private static final int VALUE_TYPE_CUSTOM = 4;
-
- /**
* Internal variables
* NOTE: This object implements the clone() method, making a deep copy of any referenced
* objects. As other non-trivial fields are added to this class, make sure to add logic
@@ -209,11 +198,6 @@
HashMap<String, PropertyValuesHolder> mValuesMap;
/**
- * The type of the values, as determined by the valueFrom/valueTo properties.
- */
- Class mValueType;
-
- /**
* Public constants
*/
@@ -234,76 +218,13 @@
public static final int INFINITE = -1;
/**
- * Creates a new animation whose parameters come from the specified context and
- * attributes set.
- *
- * @param context the application environment
- * @param attrs the set of attributes holding the animation parameters
+ * Creates a new Animator object. This default constructor is primarily for
+ * use internally; the other constructors which take parameters are more generally
+ * useful.
*/
- public Animator(Context context, AttributeSet attrs) {
- TypedArray a =
- context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Animator);
-
- mDuration = (long) a.getInt(com.android.internal.R.styleable.Animator_duration, 0);
-
- mStartDelay = (long) a.getInt(com.android.internal.R.styleable.Animator_startOffset, 0);
-
- final int resID =
- a.getResourceId(com.android.internal.R.styleable.Animator_interpolator, 0);
- if (resID > 0) {
- setInterpolator(AnimationUtils.loadInterpolator(context, resID));
- }
- int valueType = a.getInt(com.android.internal.R.styleable.Animator_valueType,
- VALUE_TYPE_FLOAT);
-
- Object valueFrom = null;
- Object valueTo = null;
-
- switch (valueType) {
- case VALUE_TYPE_FLOAT:
- valueFrom = a.getFloat(com.android.internal.R.styleable.Animator_valueFrom, 0f);
- valueTo = a.getFloat(com.android.internal.R.styleable.Animator_valueTo, 0f);
- mValueType = float.class;
- break;
- case VALUE_TYPE_INT:
- valueFrom = a.getInt(com.android.internal.R.styleable.Animator_valueFrom, 0);
- valueTo = a.getInt(com.android.internal.R.styleable.Animator_valueTo, 0);
- mValueType = int.class;
- break;
- case VALUE_TYPE_DOUBLE:
- valueFrom = (double)
- a.getFloat(com.android.internal.R.styleable.Animator_valueFrom, 0f);
- valueTo = (double)
- a.getFloat(com.android.internal.R.styleable.Animator_valueTo, 0f);
- mValueType = double.class;
- break;
- case VALUE_TYPE_COLOR:
- valueFrom = a.getInt(com.android.internal.R.styleable.Animator_valueFrom, 0);
- valueTo = a.getInt(com.android.internal.R.styleable.Animator_valueTo, 0);
- setEvaluator(new RGBEvaluator());
- mValueType = int.class;
- break;
- case VALUE_TYPE_CUSTOM:
- // TODO: How to get an 'Object' value?
- valueFrom = a.getFloat(com.android.internal.R.styleable.Animator_valueFrom, 0f);
- valueTo = a.getFloat(com.android.internal.R.styleable.Animator_valueTo, 0f);
- mValueType = Object.class;
- break;
- }
-
- PropertyValuesHolder valuesHolder = new PropertyValuesHolder("", valueFrom, valueTo);
- mValues = new PropertyValuesHolder[1];
- mValues[0] = valuesHolder;
- mValuesMap = new HashMap<String, PropertyValuesHolder>(1);
- mValuesMap.put("", valuesHolder);
-
- mRepeatCount = a.getInt(com.android.internal.R.styleable.Animator_repeatCount, mRepeatCount);
- mRepeatMode = a.getInt(com.android.internal.R.styleable.Animator_repeatMode, RESTART);
-
- a.recycle();
+ public Animator() {
}
-
/**
* Constructs an Animator object with the specified duration and set of
* values. If the values are a set of PropertyValuesHolder objects, then these objects
@@ -373,6 +294,25 @@
mInitialized = true;
}
+
+ /**
+ * Sets the length of the animation.
+ *
+ * @param duration The length of the animation, in milliseconds.
+ */
+ public void setDuration(long duration) {
+ mDuration = duration;
+ }
+
+ /**
+ * Gets the length of the animation.
+ *
+ * @return The length of the animation, in milliseconds.
+ */
+ public long getDuration() {
+ return mDuration;
+ }
+
/**
* Sets the position of the animation to the specified point in time. This time should
* be between 0 and the total duration of the animation, including any repetition. If
@@ -723,11 +663,11 @@
* @param playBackwards Whether the Animator should start playing in reverse.
*/
private void start(boolean playBackwards) {
+ mPlayingBackwards = playBackwards;
if ((mStartDelay == 0) && (Thread.currentThread() == Looper.getMainLooper().getThread())) {
// This sets the initial value of the animation, prior to actually starting it running
setCurrentPlayTime(getCurrentPlayTime());
}
- mPlayingBackwards = playBackwards;
mPlayingState = STOPPED;
sPendingAnimations.add(this);
if (sAnimationHandler == null) {
@@ -738,15 +678,6 @@
sAnimationHandler.sendEmptyMessage(ANIMATION_START);
}
- /**
- * Returns the duration that this animation will run for.
- *
- * @return The length in time of the animation, in milliseconds.
- */
- public long getDuration() {
- return mDuration;
- }
-
@Override
public void start() {
start(false);
diff --git a/core/java/android/animation/PropertyAnimator.java b/core/java/android/animation/PropertyAnimator.java
index 022ca7d..8a6edcc 100644
--- a/core/java/android/animation/PropertyAnimator.java
+++ b/core/java/android/animation/PropertyAnimator.java
@@ -16,9 +16,6 @@
package android.animation;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
import android.util.Log;
import java.lang.reflect.Method;
@@ -81,25 +78,6 @@
}
/**
- * Creates a new animation whose parameters come from the specified context and
- * attributes set.
- *
- * @param context the application environment
- * @param attrs the set of attributes holding the animation parameters
- */
- public PropertyAnimator(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- TypedArray a = context.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.PropertyAnimator);
-
- setPropertyName(a.getString(
- com.android.internal.R.styleable.PropertyAnimator_propertyName));
-
-
- a.recycle();
- }
- /**
* Determine the setter or getter function using the JavaBeans convention of setFoo or
* getFoo for a property named 'foo'. This function figures out what the name of the
* function should be and uses reflection to find the Method with that name on the
@@ -130,6 +108,14 @@
}
/**
+ * Creates a new PropertyAnimator object. This default constructor is primarily for
+ * use internally; the other constructors which take parameters are more generally
+ * useful.
+ */
+ public PropertyAnimator() {
+ }
+
+ /**
* A constructor that takes a single property name and set of values. This constructor is
* used in the simple case of animating a single property.
*
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index f190d0d..c63233e 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -17,6 +17,7 @@
package android.app;
import android.animation.Animatable;
+import android.animation.AnimatableInflater;
import android.animation.PropertyAnimator;
import android.animation.Sequencer;
import android.content.res.TypedArray;
@@ -31,7 +32,6 @@
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.view.animation.AnimationUtils;
import java.util.ArrayList;
@@ -257,7 +257,7 @@
}
if (fragment.mNextAnim != 0) {
- Animatable anim = AnimationUtils.loadAnimator(mActivity, fragment.mNextAnim);
+ Animatable anim = AnimatableInflater.loadAnimatable(mActivity, fragment.mNextAnim);
if (anim != null) {
return anim;
}
@@ -288,7 +288,7 @@
return null;
}
- return AnimationUtils.loadAnimator(mActivity, anim);
+ return AnimatableInflater.loadAnimatable(mActivity, anim);
}
void moveToState(Fragment f, int newState, int transit, int transitionStyle) {
diff --git a/core/java/android/view/animation/AnimationUtils.java b/core/java/android/view/animation/AnimationUtils.java
index 8e4cf67..c090f8e 100644
--- a/core/java/android/view/animation/AnimationUtils.java
+++ b/core/java/android/view/animation/AnimationUtils.java
@@ -16,12 +16,6 @@
package android.view.animation;
-import android.animation.Animatable;
-import android.animation.Animator;
-import android.animation.PropertyAnimator;
-import android.animation.Sequencer;
-import android.content.res.TypedArray;
-import android.util.TypedValue;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -33,7 +27,6 @@
import android.os.SystemClock;
import java.io.IOException;
-import java.util.ArrayList;
/**
* Defines common utilities for working with animations.
@@ -92,42 +85,6 @@
}
}
- /**
- * Loads an {@link Animation} object from a resource
- *
- * @param context Application context used to access resources
- * @param id The resource id of the animation to load
- * @return The animation object reference by the specified id
- * @throws NotFoundException when the animation cannot be loaded
- */
- public static Animatable loadAnimator(Context context, int id)
- throws NotFoundException {
-
- XmlResourceParser parser = null;
- try {
- parser = context.getResources().getAnimation(id);
- return createAnimatableFromXml(context, parser);
- } catch (XmlPullParserException ex) {
- NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" +
- Integer.toHexString(id));
- rnf.initCause(ex);
- throw rnf;
- } catch (IOException ex) {
- NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" +
- Integer.toHexString(id));
- rnf.initCause(ex);
- throw rnf;
- } finally {
- if (parser != null) parser.close();
- }
- }
-
- private static Animatable createAnimatableFromXml(Context c, XmlPullParser parser)
- throws XmlPullParserException, IOException {
-
- return createAnimatableFromXml(c, parser, Xml.asAttributeSet(parser), null, 0);
- }
-
private static Animation createAnimationFromXml(Context c, XmlPullParser parser)
throws XmlPullParserException, IOException {
@@ -176,66 +133,6 @@
}
- private static Animatable createAnimatableFromXml(Context c, XmlPullParser parser,
- AttributeSet attrs, Sequencer parent, int sequenceOrdering)
- throws XmlPullParserException, IOException {
-
- Animatable anim = null;
- ArrayList<Animatable> childAnims = null;
-
- // Make sure we are on a start tag.
- int type;
- int depth = parser.getDepth();
-
- while (((type=parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth)
- && type != XmlPullParser.END_DOCUMENT) {
-
- if (type != XmlPullParser.START_TAG) {
- continue;
- }
-
- String name = parser.getName();
-
- if (name.equals("property")) {
- anim = new PropertyAnimator(c, attrs);
- } else if (name.equals("animator")) {
- anim = new Animator(c, attrs);
- } else if (name.equals("sequencer")) {
- anim = new Sequencer();
- TypedArray a = c.obtainStyledAttributes(attrs,
- com.android.internal.R.styleable.Sequencer);
- int ordering = a.getInt(com.android.internal.R.styleable.Sequencer_ordering,
- TOGETHER);
- createAnimatableFromXml(c, parser, attrs, (Sequencer) anim, ordering);
- a.recycle();
- } else {
- throw new RuntimeException("Unknown animator name: " + parser.getName());
- }
-
- if (parent != null) {
- if (childAnims == null) {
- childAnims = new ArrayList<Animatable>();
- }
- childAnims.add(anim);
- }
- }
- if (parent != null && childAnims != null) {
- Animatable[] animsArray = new Animatable[childAnims.size()];
- int index = 0;
- for (Animatable a : childAnims) {
- animsArray[index++] = a;
- }
- if (sequenceOrdering == TOGETHER) {
- parent.playTogether(animsArray);
- } else {
- parent.playSequentially(animsArray);
- }
- }
-
- return anim;
-
- }
-
public static LayoutAnimationController loadLayoutAnimation(Context context, int id)
throws NotFoundException {