am cc48c144: Merge "Make animators more robust against ending mid-stream" into jb-mr1-dev
* commit 'cc48c144bb0c15e003d1b9469c87a2c132ea6308': Make animators more robust against ending mid-stream
This commit is contained in:
@@ -536,6 +536,9 @@ public class ValueAnimator extends Animator {
|
||||
// The per-thread list of all active animations
|
||||
private final ArrayList<ValueAnimator> mAnimations = new ArrayList<ValueAnimator>();
|
||||
|
||||
// Used in doAnimationFrame() to avoid concurrent modifications of mAnimations
|
||||
private final ArrayList<ValueAnimator> mTmpAnimations = new ArrayList<ValueAnimator>();
|
||||
|
||||
// The per-thread set of animations to be started on the next animation frame
|
||||
private final ArrayList<ValueAnimator> mPendingAnimations = new ArrayList<ValueAnimator>();
|
||||
|
||||
@@ -605,28 +608,18 @@ public class ValueAnimator extends Animator {
|
||||
// Now process all active animations. The return value from animationFrame()
|
||||
// tells the handler whether it should now be ended
|
||||
int numAnims = mAnimations.size();
|
||||
int i = 0;
|
||||
while (i < numAnims) {
|
||||
ValueAnimator anim = mAnimations.get(i);
|
||||
if (anim.doAnimationFrame(frameTime)) {
|
||||
for (int i = 0; i < numAnims; ++i) {
|
||||
mTmpAnimations.add(mAnimations.get(i));
|
||||
}
|
||||
for (int i = 0; i < numAnims; ++i) {
|
||||
ValueAnimator anim = mTmpAnimations.get(i);
|
||||
if (mAnimations.contains(anim) && anim.doAnimationFrame(frameTime)) {
|
||||
mEndingAnims.add(anim);
|
||||
}
|
||||
if (mAnimations.size() == numAnims) {
|
||||
++i;
|
||||
} else {
|
||||
// An animation might be canceled or ended by client code
|
||||
// during the animation frame. Check to see if this happened by
|
||||
// seeing whether the current index is the same as it was before
|
||||
// calling animationFrame(). Another approach would be to copy
|
||||
// animations to a temporary list and process that list instead,
|
||||
// but that entails garbage and processing overhead that would
|
||||
// be nice to avoid.
|
||||
--numAnims;
|
||||
mEndingAnims.remove(anim);
|
||||
}
|
||||
}
|
||||
mTmpAnimations.clear();
|
||||
if (mEndingAnims.size() > 0) {
|
||||
for (i = 0; i < mEndingAnims.size(); ++i) {
|
||||
for (int i = 0; i < mEndingAnims.size(); ++i) {
|
||||
mEndingAnims.get(i).endAnimation(this);
|
||||
}
|
||||
mEndingAnims.clear();
|
||||
|
||||
Reference in New Issue
Block a user