package com.reactnativenavigation.views.collapsingToolbar;
import android.util.Log;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import static com.reactnativenavigation.views.collapsingToolbar.CollapsingTopBarReactHeaderAnimator.State.Invisible;
import static com.reactnativenavigation.views.collapsingToolbar.CollapsingTopBarReactHeaderAnimator.State.Visible;
class CollapsingTopBarReactHeaderAnimator {
interface OnVisibleListener {
void onVisible();
}
interface OnHiddenListener {
void onHidden();
}
enum State {Visible, Invisible}
private State state = Invisible;
private CollapsingTopBarReactHeader header;
private final float hideThreshold;
private float showThreshold;
private final static int ANIMATION_DURATION = 360;
private final Interpolator interpolator = new DecelerateInterpolator();
private OnVisibleListener onVisibleListener;
private OnHiddenListener onHiddenListener;
void setOnVisibleListener(OnVisibleListener onVisibleListener) {
this.onVisibleListener = onVisibleListener;
}
void setOnHiddenListener(OnHiddenListener onHiddenListener) {
this.onHiddenListener = onHiddenListener;
}
CollapsingTopBarReactHeaderAnimator(CollapsingTopBarReactHeader header, float hideThreshold, float showThreshold) {
this.header = header;
this.hideThreshold = hideThreshold;
this.showThreshold = showThreshold;
}
public void collapse(float collapse) {
if (shouldShow(collapse)) {
show();
} else if (shouldHide(collapse)) {
hide();
}
}
private boolean shouldShow(float collapse) {
Log.i("shouldShow", "collapse: " + collapse + "[" + showThreshold + "]");
return Math.abs(collapse) < showThreshold && state == Invisible;
}
private boolean shouldHide(float collapse) {
Log.i("shouldHide", "collapse: " + collapse + "[" + hideThreshold + "]");
return Math.abs(collapse) >= hideThreshold && state == Visible;
}
private void show() {
if (state == Invisible && onVisibleListener != null) {
onVisibleListener.onVisible();
}
state = State.Visible;
header.animate()
.alpha(1)
.setDuration(ANIMATION_DURATION)
.setInterpolator(interpolator);
}
private void hide() {
if (state == Visible && onHiddenListener != null) {
onHiddenListener.onHidden();
}
state = State.Invisible;
header.animate()
.alpha(0)
.setDuration(ANIMATION_DURATION)
.setInterpolator(interpolator);
}
}