Merge "ASLD: ASLD's XML reversible flag can turn off the reverse behavior now." into lmp-mr1-dev
This commit is contained in:
@@ -199,6 +199,8 @@ public class AnimatedStateListDrawable extends StateListDrawable {
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean hasReversibleFlag = state.transitionHasReversibleFlag(fromId, toId);
|
||||
|
||||
// This may fail if we're already on the transition, but that's okay!
|
||||
selectDrawable(transitionIndex);
|
||||
|
||||
@@ -206,10 +208,14 @@ public class AnimatedStateListDrawable extends StateListDrawable {
|
||||
final Drawable d = getCurrent();
|
||||
if (d instanceof AnimationDrawable) {
|
||||
final boolean reversed = state.isTransitionReversed(fromId, toId);
|
||||
transition = new AnimationDrawableTransition((AnimationDrawable) d, reversed);
|
||||
|
||||
transition = new AnimationDrawableTransition((AnimationDrawable) d,
|
||||
reversed, hasReversibleFlag);
|
||||
} else if (d instanceof AnimatedVectorDrawable) {
|
||||
final boolean reversed = state.isTransitionReversed(fromId, toId);
|
||||
transition = new AnimatedVectorDrawableTransition((AnimatedVectorDrawable) d, reversed);
|
||||
|
||||
transition = new AnimatedVectorDrawableTransition((AnimatedVectorDrawable) d,
|
||||
reversed, hasReversibleFlag);
|
||||
} else if (d instanceof Animatable) {
|
||||
transition = new AnimatableTransition((Animatable) d);
|
||||
} else {
|
||||
@@ -260,7 +266,12 @@ public class AnimatedStateListDrawable extends StateListDrawable {
|
||||
private static class AnimationDrawableTransition extends Transition {
|
||||
private final ObjectAnimator mAnim;
|
||||
|
||||
public AnimationDrawableTransition(AnimationDrawable ad, boolean reversed) {
|
||||
// Even AnimationDrawable is always reversible technically, but
|
||||
// we should obey the XML's android:reversible flag.
|
||||
private final boolean mHasReversibleFlag;
|
||||
|
||||
public AnimationDrawableTransition(AnimationDrawable ad,
|
||||
boolean reversed, boolean hasReversibleFlag) {
|
||||
final int frameCount = ad.getNumberOfFrames();
|
||||
final int fromFrame = reversed ? frameCount - 1 : 0;
|
||||
final int toFrame = reversed ? 0 : frameCount - 1;
|
||||
@@ -269,13 +280,13 @@ public class AnimatedStateListDrawable extends StateListDrawable {
|
||||
anim.setAutoCancel(true);
|
||||
anim.setDuration(interp.getTotalDuration());
|
||||
anim.setInterpolator(interp);
|
||||
|
||||
mHasReversibleFlag = hasReversibleFlag;
|
||||
mAnim = anim;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canReverse() {
|
||||
return true;
|
||||
return mHasReversibleFlag;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -296,16 +307,28 @@ public class AnimatedStateListDrawable extends StateListDrawable {
|
||||
|
||||
private static class AnimatedVectorDrawableTransition extends Transition {
|
||||
private final AnimatedVectorDrawable mAvd;
|
||||
|
||||
// mReversed is indicating the current transition's direction.
|
||||
private final boolean mReversed;
|
||||
|
||||
public AnimatedVectorDrawableTransition(AnimatedVectorDrawable avd, boolean reversed) {
|
||||
// mHasReversibleFlag is indicating whether the whole transition has
|
||||
// reversible flag set to true.
|
||||
// If mHasReversibleFlag is false, then mReversed is always false.
|
||||
private final boolean mHasReversibleFlag;
|
||||
|
||||
public AnimatedVectorDrawableTransition(AnimatedVectorDrawable avd,
|
||||
boolean reversed, boolean hasReversibleFlag) {
|
||||
mAvd = avd;
|
||||
mReversed = reversed;
|
||||
mHasReversibleFlag = hasReversibleFlag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canReverse() {
|
||||
return mAvd.canReverse();
|
||||
// When the transition's XML says it is not reversible, then we obey
|
||||
// it, even if the AVD itself is reversible.
|
||||
// This will help the single direction transition.
|
||||
return mAvd.canReverse() && mHasReversibleFlag;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -322,7 +345,8 @@ public class AnimatedStateListDrawable extends StateListDrawable {
|
||||
if (canReverse()) {
|
||||
mAvd.reverse();
|
||||
} else {
|
||||
Log.w(LOGTAG, "Reverse() is called on a drawable can't reverse");
|
||||
Log.w(LOGTAG, "Can't reverse, either the reversible is set to false,"
|
||||
+ " or the AnimatedVectorDrawable can't reverse");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -520,8 +544,12 @@ public class AnimatedStateListDrawable extends StateListDrawable {
|
||||
}
|
||||
|
||||
static class AnimatedStateListState extends StateListState {
|
||||
private static final int REVERSE_SHIFT = 32;
|
||||
private static final int REVERSE_MASK = 0x1;
|
||||
// REVERSED_BIT is indicating the current transition's direction.
|
||||
private static final long REVERSED_BIT = 0x100000000l;
|
||||
|
||||
// REVERSIBLE_FLAG_BIT is indicating whether the whole transition has
|
||||
// reversible flag set to true.
|
||||
private static final long REVERSIBLE_FLAG_BIT = 0x200000000l;
|
||||
|
||||
int[] mAnimThemeAttrs;
|
||||
|
||||
@@ -545,11 +573,15 @@ public class AnimatedStateListDrawable extends StateListDrawable {
|
||||
int addTransition(int fromId, int toId, @NonNull Drawable anim, boolean reversible) {
|
||||
final int pos = super.addChild(anim);
|
||||
final long keyFromTo = generateTransitionKey(fromId, toId);
|
||||
mTransitions.append(keyFromTo, pos);
|
||||
long reversibleBit = 0;
|
||||
if (reversible) {
|
||||
reversibleBit = REVERSIBLE_FLAG_BIT;
|
||||
}
|
||||
mTransitions.append(keyFromTo, pos | reversibleBit);
|
||||
|
||||
if (reversible) {
|
||||
final long keyToFrom = generateTransitionKey(toId, fromId);
|
||||
mTransitions.append(keyToFrom, pos | (1L << REVERSE_SHIFT));
|
||||
mTransitions.append(keyToFrom, pos | REVERSED_BIT | reversibleBit);
|
||||
}
|
||||
|
||||
return addChild(anim);
|
||||
@@ -581,7 +613,12 @@ public class AnimatedStateListDrawable extends StateListDrawable {
|
||||
|
||||
boolean isTransitionReversed(int fromId, int toId) {
|
||||
final long keyFromTo = generateTransitionKey(fromId, toId);
|
||||
return (mTransitions.get(keyFromTo, -1) >> REVERSE_SHIFT & REVERSE_MASK) == 1;
|
||||
return (mTransitions.get(keyFromTo, -1) & REVERSED_BIT) != 0;
|
||||
}
|
||||
|
||||
boolean transitionHasReversibleFlag(int fromId, int toId) {
|
||||
final long keyFromTo = generateTransitionKey(fromId, toId);
|
||||
return (mTransitions.get(keyFromTo, -1) & REVERSIBLE_FLAG_BIT) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -462,19 +462,22 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable {
|
||||
/**
|
||||
* Reverses ongoing animations or starts pending animations in reverse.
|
||||
* <p>
|
||||
* NOTE: Only works of all animations are ValueAnimators.
|
||||
* NOTE: Only works if all animations support reverse. Otherwise, this will
|
||||
* do nothing.
|
||||
* @hide
|
||||
*/
|
||||
public void reverse() {
|
||||
// Only reverse when all the animators can be reverse. Otherwise, partially
|
||||
// reverse is confusing.
|
||||
if (!canReverse()) {
|
||||
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);
|
||||
if (animator.canReverse()) {
|
||||
animator.reverse();
|
||||
} else {
|
||||
Log.w(LOGTAG, "AnimatedVectorDrawable can't reverse()");
|
||||
}
|
||||
animator.reverse();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,12 +15,8 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<objectAnimator
|
||||
android:duration="3300"
|
||||
android:propertyName="rotation"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="360"
|
||||
android:repeatCount="-1" />
|
||||
</set>
|
||||
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:duration="3300"
|
||||
android:propertyName="rotation"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="450" />
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<!--
|
||||
Copyright (C) 2014 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.
|
||||
-->
|
||||
|
||||
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/on" android:state_checked="true"
|
||||
android:drawable="@drawable/vector_drawable_favorite" />
|
||||
<item android:id="@+id/off"
|
||||
android:drawable="@drawable/vector_drawable_favorite" />
|
||||
<transition android:fromId="@+id/off" android:toId="@+id/on"
|
||||
android:drawable="@drawable/animation_drawable_vector"
|
||||
android:reversible="true">
|
||||
</transition>
|
||||
</animated-selector>
|
||||
@@ -0,0 +1,26 @@
|
||||
<!--
|
||||
Copyright (C) 2014 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.
|
||||
-->
|
||||
|
||||
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/on" android:state_checked="true"
|
||||
android:drawable="@drawable/vector_drawable_favorite" />
|
||||
<item android:id="@+id/off" android:state_checked="false"
|
||||
android:drawable="@drawable/vector_drawable_favorite" />
|
||||
<transition android:fromId="@+id/off" android:toId="@+id/on"
|
||||
android:drawable="@drawable/animation_drawable_vector"
|
||||
android:reversible="false">
|
||||
</transition>
|
||||
</animated-selector>
|
||||
@@ -17,7 +17,7 @@
|
||||
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/on" android:state_checked="true"
|
||||
android:drawable="@drawable/vector_drawable12" />
|
||||
<item android:id="@+id/off"
|
||||
<item android:id="@+id/off" android:state_checked="false"
|
||||
android:drawable="@drawable/vector_drawable12" />
|
||||
<transition android:fromId="@+id/off" android:toId="@+id/on" android:reversible="true">
|
||||
<animated-vector android:drawable="@drawable/vector_drawable12">
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<!--
|
||||
Copyright (C) 2014 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.
|
||||
-->
|
||||
|
||||
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/on" android:state_checked="true"
|
||||
android:drawable="@drawable/vector_drawable12" />
|
||||
<item android:id="@+id/off" android:state_checked="false"
|
||||
android:drawable="@drawable/vector_drawable12" />
|
||||
<transition android:fromId="@+id/off" android:toId="@+id/on" android:reversible="false">
|
||||
<animated-vector android:drawable="@drawable/vector_drawable12">
|
||||
<target
|
||||
android:name="pie1"
|
||||
android:animation="@anim/trim_path_animation01" />
|
||||
<target
|
||||
android:name="v"
|
||||
android:animation="@anim/trim_path_animation02" />
|
||||
<target
|
||||
android:name="v"
|
||||
android:animation="@anim/trim_path_animation05" />
|
||||
<target
|
||||
android:name="rotationGroup"
|
||||
android:animation="@anim/trim_path_animation03" />
|
||||
<target
|
||||
android:name="rotationGroup3"
|
||||
android:animation="@anim/trim_path_animation03" />
|
||||
<target
|
||||
android:name="rotationGroupBlue"
|
||||
android:animation="@anim/trim_path_animation03" />
|
||||
<target
|
||||
android:name="rotationGroup"
|
||||
android:animation="@anim/trim_path_animation04" />
|
||||
</animated-vector>
|
||||
</transition>
|
||||
</animated-selector>
|
||||
@@ -0,0 +1,26 @@
|
||||
<!--
|
||||
Copyright (C) 2014 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.
|
||||
-->
|
||||
|
||||
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/on" android:state_checked="true"
|
||||
android:drawable="@drawable/vector_drawable_grouping_1" />
|
||||
<item android:id="@+id/off" android:state_checked="false"
|
||||
android:drawable="@drawable/vector_drawable_grouping_1" />
|
||||
<transition android:fromId="@+id/off" android:toId="@+id/on"
|
||||
android:drawable="@drawable/animation_vector_drawable_grouping_1"
|
||||
android:reversible="false">
|
||||
</transition>
|
||||
</animated-selector>
|
||||
@@ -17,7 +17,7 @@
|
||||
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/on" android:state_checked="true"
|
||||
android:drawable="@drawable/vector_drawable_favorite" />
|
||||
<item android:id="@+id/off"
|
||||
<item android:id="@+id/off" android:state_checked="false"
|
||||
android:drawable="@drawable/vector_drawable_favorite" />
|
||||
<transition android:fromId="@+id/off" android:toId="@+id/on"
|
||||
android:drawable="@drawable/animation_vector_drawable_favorite"
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<!--
|
||||
Copyright (C) 2014 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.
|
||||
-->
|
||||
|
||||
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/on" android:state_checked="true"
|
||||
android:drawable="@drawable/vector_drawable_favorite" />
|
||||
<item android:id="@+id/off" android:state_checked="false"
|
||||
android:drawable="@drawable/vector_drawable_favorite" />
|
||||
<transition android:fromId="@+id/off" android:toId="@+id/on"
|
||||
android:drawable="@drawable/animation_vector_drawable_favorite"
|
||||
android:reversible="false">
|
||||
</transition>
|
||||
</animated-selector>
|
||||
@@ -27,9 +27,16 @@ public class AnimatedStateVectorDrawableTest extends Activity {
|
||||
private static final String LOGCAT = "AnimatedStateVectorDrawableTest";
|
||||
|
||||
protected int[] icon = {
|
||||
// These shows pairs of ASLD , the left side set the reversible to true.
|
||||
// the right side set to false.
|
||||
R.drawable.state_animation_vector_drawable01,
|
||||
R.drawable.state_animation_vector_drawable01_false,
|
||||
R.drawable.state_animation_vector_drawable02,
|
||||
R.drawable.state_animation_vector_drawable02_false,
|
||||
R.drawable.state_animation_vector_drawable03,
|
||||
R.drawable.state_animation_vector_drawable03_false,
|
||||
R.drawable.state_animation_drawable04,
|
||||
R.drawable.state_animation_drawable04_false,
|
||||
};
|
||||
|
||||
@Override
|
||||
@@ -39,7 +46,7 @@ public class AnimatedStateVectorDrawableTest extends Activity {
|
||||
ScrollView scrollView = new ScrollView(this);
|
||||
GridLayout container = new GridLayout(this);
|
||||
scrollView.addView(container);
|
||||
container.setColumnCount(5);
|
||||
container.setColumnCount(2);
|
||||
|
||||
for (int i = 0; i < icon.length; i++) {
|
||||
CheckBox button = new CheckBox(this);
|
||||
|
||||
Reference in New Issue
Block a user