// Copyright 2004-present Facebook. All Rights Reserved.
package com.facebook.react.uimanager.layoutanimation;
import javax.annotation.Nullable;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
/**
* Class responsible for handling layout update animation, applied to view whenever a valid config
* was supplied for the layout animation of UPDATE type.
*/
/* package */ class LayoutUpdateAnimation extends AbstractLayoutAnimation {
// We are currently not enabling translation GPU-accelerated animated, as it creates odd
// artifacts with native react scrollview. This needs to be investigated.
private static final boolean USE_TRANSLATE_ANIMATION = false;
@Override
boolean isValid() {
return mDurationMs > 0;
}
@Override
@Nullable Animation createAnimationImpl(View view, int x, int y, int width, int height) {
boolean animateLocation = view.getX() != x || view.getY() != y;
boolean animateSize = view.getWidth() != width || view.getHeight() != height;
if (!animateLocation && !animateSize) {
return null;
} else if (animateLocation && !animateSize && USE_TRANSLATE_ANIMATION) {
// Use GPU-accelerated animation, however we loose the ability to resume interrupted
// animation where it was left off. We may be able to listen to animation interruption
// and set the layout manually in this case, so that next animation kicks off smoothly.
return new TranslateAnimation(view.getX() - x, 0, view.getY() - y, 0);
} else {
// Animation is sub-optimal for perf, but scale transformation can't be use in this case.
return new PositionAndSizeAnimation(view, x, y, width, height);
}
}
}