124 lines
5.3 KiB
Java
124 lines
5.3 KiB
Java
package androidx.transition;
|
|
|
|
import android.animation.Animator;
|
|
import android.animation.TimeInterpolator;
|
|
import android.content.Context;
|
|
import android.graphics.Rect;
|
|
import android.util.AttributeSet;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.animation.AccelerateInterpolator;
|
|
import android.view.animation.DecelerateInterpolator;
|
|
import androidx.annotation.NonNull;
|
|
public class Explode extends Visibility {
|
|
private static final String PROPNAME_SCREEN_BOUNDS = "android:explode:screenBounds";
|
|
private static final TimeInterpolator sAccelerate = new AccelerateInterpolator();
|
|
private static final TimeInterpolator sDecelerate = new DecelerateInterpolator();
|
|
private int[] mTempLoc;
|
|
|
|
public Explode() {
|
|
this.mTempLoc = new int[2];
|
|
setPropagation(new CircularPropagation());
|
|
}
|
|
|
|
public Explode(Context context, AttributeSet attributeSet) {
|
|
super(context, attributeSet);
|
|
this.mTempLoc = new int[2];
|
|
setPropagation(new CircularPropagation());
|
|
}
|
|
|
|
private static float calculateDistance(float f, float f2) {
|
|
return (float) Math.sqrt((double) ((f2 * f2) + (f * f)));
|
|
}
|
|
|
|
private static float calculateMaxDistance(View view, int i, int i2) {
|
|
return calculateDistance((float) Math.max(i, view.getWidth() - i), (float) Math.max(i2, view.getHeight() - i2));
|
|
}
|
|
|
|
private void calculateOut(View view, Rect rect, int[] iArr) {
|
|
int i;
|
|
int i2;
|
|
view.getLocationOnScreen(this.mTempLoc);
|
|
int[] iArr2 = this.mTempLoc;
|
|
int i3 = iArr2[0];
|
|
int i4 = iArr2[1];
|
|
Rect epicenter = getEpicenter();
|
|
if (epicenter == null) {
|
|
i2 = Math.round(view.getTranslationX()) + (view.getWidth() / 2) + i3;
|
|
i = Math.round(view.getTranslationY()) + (view.getHeight() / 2) + i4;
|
|
} else {
|
|
i2 = epicenter.centerX();
|
|
i = epicenter.centerY();
|
|
}
|
|
float centerX = (float) (rect.centerX() - i2);
|
|
float centerY = (float) (rect.centerY() - i);
|
|
if (centerX == 0.0f && centerY == 0.0f) {
|
|
centerX = ((float) (Math.random() * 2.0d)) - 1.0f;
|
|
centerY = ((float) (Math.random() * 2.0d)) - 1.0f;
|
|
}
|
|
float calculateDistance = calculateDistance(centerX, centerY);
|
|
float calculateMaxDistance = calculateMaxDistance(view, i2 - i3, i - i4);
|
|
iArr[0] = Math.round((centerX / calculateDistance) * calculateMaxDistance);
|
|
iArr[1] = Math.round(calculateMaxDistance * (centerY / calculateDistance));
|
|
}
|
|
|
|
private void captureValues(TransitionValues transitionValues) {
|
|
View view = transitionValues.view;
|
|
view.getLocationOnScreen(this.mTempLoc);
|
|
int[] iArr = this.mTempLoc;
|
|
int i = iArr[0];
|
|
int i2 = iArr[1];
|
|
transitionValues.values.put("android:explode:screenBounds", new Rect(i, i2, view.getWidth() + i, view.getHeight() + i2));
|
|
}
|
|
|
|
@Override // androidx.transition.Visibility, androidx.transition.Transition
|
|
public void captureEndValues(@NonNull TransitionValues transitionValues) {
|
|
super.captureEndValues(transitionValues);
|
|
captureValues(transitionValues);
|
|
}
|
|
|
|
@Override // androidx.transition.Visibility, androidx.transition.Transition
|
|
public void captureStartValues(@NonNull TransitionValues transitionValues) {
|
|
super.captureStartValues(transitionValues);
|
|
captureValues(transitionValues);
|
|
}
|
|
|
|
@Override // androidx.transition.Visibility
|
|
public Animator onAppear(ViewGroup viewGroup, View view, TransitionValues transitionValues, TransitionValues transitionValues2) {
|
|
if (transitionValues2 == null) {
|
|
return null;
|
|
}
|
|
Rect rect = (Rect) transitionValues2.values.get("android:explode:screenBounds");
|
|
float translationX = view.getTranslationX();
|
|
float translationY = view.getTranslationY();
|
|
calculateOut(viewGroup, rect, this.mTempLoc);
|
|
int[] iArr = this.mTempLoc;
|
|
return TranslationAnimationCreator.createAnimation(view, transitionValues2, rect.left, rect.top, translationX + ((float) iArr[0]), translationY + ((float) iArr[1]), translationX, translationY, sDecelerate, this);
|
|
}
|
|
|
|
@Override // androidx.transition.Visibility
|
|
public Animator onDisappear(ViewGroup viewGroup, View view, TransitionValues transitionValues, TransitionValues transitionValues2) {
|
|
float f;
|
|
float f2;
|
|
if (transitionValues == null) {
|
|
return null;
|
|
}
|
|
Rect rect = (Rect) transitionValues.values.get("android:explode:screenBounds");
|
|
int i = rect.left;
|
|
int i2 = rect.top;
|
|
float translationX = view.getTranslationX();
|
|
float translationY = view.getTranslationY();
|
|
int[] iArr = (int[]) transitionValues.view.getTag(R.id.transition_position);
|
|
if (iArr != null) {
|
|
f2 = ((float) (iArr[0] - rect.left)) + translationX;
|
|
f = ((float) (iArr[1] - rect.top)) + translationY;
|
|
rect.offsetTo(iArr[0], iArr[1]);
|
|
} else {
|
|
f2 = translationX;
|
|
f = translationY;
|
|
}
|
|
calculateOut(viewGroup, rect, this.mTempLoc);
|
|
int[] iArr2 = this.mTempLoc;
|
|
return TranslationAnimationCreator.createAnimation(view, transitionValues, i, i2, translationX, translationY, f2 + ((float) iArr2[0]), f + ((float) iArr2[1]), sAccelerate, this);
|
|
}
|
|
}
|