package org.getlantern.firetweet.activity.iface; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.ObjectAnimator; import android.util.Property; import android.view.animation.DecelerateInterpolator; /** * Created by mariotaku on 14/10/21. */ public interface IControlBarActivity { public void setControlBarOffset(float offset); public void setControlBarVisibleAnimate(boolean visible); public float getControlBarOffset(); public int getControlBarHeight(); public void notifyControlBarOffsetChanged(); public void registerControlBarOffsetListener(ControlBarOffsetListener listener); public void unregisterControlBarOffsetListener(ControlBarOffsetListener listener); public interface ControlBarOffsetListener { public void onControlBarOffsetChanged(IControlBarActivity activity, float offset); } public final class ControlBarShowHideHelper { private static final long DURATION = 200l; private final IControlBarActivity mActivity; private int mControlAnimationDirection; public ControlBarShowHideHelper(IControlBarActivity activity) { mActivity = activity; } private static class ControlBarOffsetProperty extends Property<IControlBarActivity, Float> { public static final ControlBarOffsetProperty SINGLETON = new ControlBarOffsetProperty(); @Override public void set(IControlBarActivity object, Float value) { object.setControlBarOffset(value); } public ControlBarOffsetProperty() { super(Float.TYPE, null); } @Override public Float get(IControlBarActivity object) { return object.getControlBarOffset(); } } public void setControlBarVisibleAnimate(boolean visible) { if (mControlAnimationDirection != 0) return; final ObjectAnimator animator; final float offset = mActivity.getControlBarOffset(); if (visible) { if (offset >= 1) return; animator = ObjectAnimator.ofFloat(mActivity, ControlBarOffsetProperty.SINGLETON, offset, 1); } else { if (offset <= 0) return; animator = ObjectAnimator.ofFloat(mActivity, ControlBarOffsetProperty.SINGLETON, offset, 0); } animator.setInterpolator(new DecelerateInterpolator()); animator.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { mControlAnimationDirection = 0; } @Override public void onAnimationCancel(Animator animation) { mControlAnimationDirection = 0; } @Override public void onAnimationRepeat(Animator animation) { } }); animator.setDuration(DURATION); animator.start(); mControlAnimationDirection = visible ? 1 : -1; } } }