package de.geeksfactory.opacclient.ui;
import android.animation.Animator;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.transition.Transition;
import android.transition.TransitionValues;
import android.transition.Visibility;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.ViewGroup;
/**
* A transition between Activities that circularly reveals views when appearing (API 21+). Based on
* https://github.com/tony-w/PaletteColorExtraction/blob/master/app/src/main/java/com/tonyw
* /sampleapps/palettecolorextraction/CircularRevealTransition.java
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class CircularRevealTransition extends Visibility {
/**
* The x-coordinate of the revealing circle.
*/
private int x;
/**
* The y-coordinate of the revealing circle.
*/
private int y;
public CircularRevealTransition() {
}
public CircularRevealTransition(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* Set the start position of a the animation by passing in a view where the revealing circle
* will originate.
*/
public Transition setStartPosition(Activity activity, View v) {
Rect rect = new Rect();
v.getGlobalVisibleRect(rect);
setStartPosition(activity, rect.centerX(), rect.centerY());
return this;
}
/**
* Set the start position of a the animation where the revealing circle will originate.
*/
public Transition setStartPosition(Activity activity, int x, int y) {
this.x = x;
this.y = y
// Subtract off height of action bar and status bar, which apparently isn't
// done when calculating the global visible rect... (status bar height=25dp)
- (int) Math.ceil(25 * activity.getResources().getDisplayMetrics().density);
return this;
}
@Override
public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues,
TransitionValues endValues) {
// get the final radius for the clipping circle
int finalRadius = Math.max(view.getWidth(), view.getHeight());
// create the animator for this view (the start radius is zero)
return ViewAnimationUtils.createCircularReveal(view, x, y, 0, finalRadius);
}
@Override
public Animator onDisappear(ViewGroup sceneRoot, final View view, TransitionValues startValues,
TransitionValues endValues) {
// get the initial radius for the clipping circle
int initialRadius = view.getWidth();
// create the animation (the final radius is zero)
return ViewAnimationUtils.createCircularReveal(view, x, y, initialRadius, 0);
}
}