package com.reactnativenavigation.views; import android.content.Context; import android.view.View; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import com.reactnativenavigation.params.StyleParams; import static com.reactnativenavigation.views.Scrim.State.Invisible; import static com.reactnativenavigation.views.Scrim.State.Visible; public class Scrim extends View { enum State {Visible, Invisible} private State state = Invisible; private final float collapseThreshold; private final static int ANIMATION_DURATION = 600; private final Interpolator interpolator; public Scrim(Context context, StyleParams.Color color, float collapseThreshold) { super(context); this.collapseThreshold = collapseThreshold; setBackgroundColor(color.getColor()); setAlpha(0); interpolator = new DecelerateInterpolator(); } public void collapse(float collapse) { if (shouldShowScrim(collapse)) { showScrim(); } else if (shouldHideScrim(collapse)) { hideScrim(); } } private boolean shouldShowScrim(float collapse) { return Math.abs(collapse) >= collapseThreshold && state == Invisible; } private boolean shouldHideScrim(float collapse) { return Math.abs(collapse) < collapseThreshold && state == Visible; } private void showScrim() { state = Visible; animate() .alpha(1) .setDuration(ANIMATION_DURATION) .setInterpolator(interpolator); } private void hideScrim() { state = Invisible; animate() .alpha(0) .setDuration(ANIMATION_DURATION) .setInterpolator(interpolator); } }