com.facebook.react.uimanager.layoutanimation.PositionAndSizeAnimation Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of react-native Show documentation
Show all versions of react-native Show documentation
A framework for building native apps with React
// Copyright 2004-present Facebook. All Rights Reserved.
package com.facebook.react.uimanager.layoutanimation;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
/**
* Animation responsible for updating size and position of a view. We can't use scaling as view
* content may not necessarily stretch. As a result, this approach is inefficient because of
* layout passes occurring on every frame.
* What we might want to try to do instead is use a combined ScaleAnimation and TranslateAnimation.
*/
/* package */ class PositionAndSizeAnimation extends Animation implements HandleLayout {
private final View mView;
private final float mStartX, mStartY, mDeltaX, mDeltaY;
private final int mStartWidth, mStartHeight, mDeltaWidth, mDeltaHeight;
public PositionAndSizeAnimation(View view, int x, int y, int width, int height) {
mView = view;
mStartX = view.getX();
mStartY = view.getY();
mStartWidth = view.getWidth();
mStartHeight = view.getHeight();
mDeltaX = x - mStartX;
mDeltaY = y - mStartY;
mDeltaWidth = width - mStartWidth;
mDeltaHeight = height - mStartHeight;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
float newX = mStartX + mDeltaX * interpolatedTime;
float newY = mStartY + mDeltaY * interpolatedTime;
float newWidth = mStartWidth + mDeltaWidth * interpolatedTime;
float newHeight = mStartHeight + mDeltaHeight * interpolatedTime;
mView.layout(
Math.round(newX),
Math.round(newY),
Math.round(newX + newWidth),
Math.round(newY + newHeight));
}
@Override
public boolean willChangeBounds() {
return true;
}
}