blob: f2b5e5e1543428d9723a62f7806cbd5f42bdddbd [file] [log] [blame]
package com.android.launcher3.util;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.TargetApi;
import android.os.Build;
import android.view.View;
import android.view.ViewOutlineProvider;
import com.android.launcher3.Utilities;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class UiThreadCircularReveal {
public static ValueAnimator createCircularReveal(View v, int x, int y, float r0, float r1) {
return createCircularReveal(v, x, y, r0, r1, ViewOutlineProvider.BACKGROUND);
}
public static ValueAnimator createCircularReveal(View v, int x, int y, float r0, float r1,
final ViewOutlineProvider originalProvider) {
ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
final View revealView = v;
final RevealOutlineProvider outlineProvider = new RevealOutlineProvider(x, y, r0, r1);
final float elevation = v.getElevation();
va.addListener(new AnimatorListenerAdapter() {
public void onAnimationStart(Animator animation) {
revealView.setOutlineProvider(outlineProvider);
revealView.setClipToOutline(true);
revealView.setTranslationZ(-elevation);
}
public void onAnimationEnd(Animator animation) {
revealView.setOutlineProvider(originalProvider);
revealView.setClipToOutline(false);
revealView.setTranslationZ(0);
}
});
va.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator arg0) {
float progress = arg0.getAnimatedFraction();
outlineProvider.setProgress(progress);
revealView.invalidateOutline();
if (!Utilities.ATLEAST_LOLLIPOP_MR1) {
revealView.invalidate();
}
}
});
return va;
}
}