package org.succlz123.doubanbooklog.support.com.shamanland.fab;
import android.content.Context;
import android.os.Build;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
/**
* Implementation of {@link View.OnTouchListener} which uses {@link GestureDetector} to recognize scrolling events.
*/
public abstract class ScrollDetector extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener {
private final GestureDetector mDetector;
private final int mSlop;
private float mDownY;
private boolean mDirection;
private boolean mIgnore;
/**
* Called when {@link #onScroll(MotionEvent, MotionEvent, float, float)} recognize direction of user gesture as DOWN.
*/
public abstract void onScrollDown();
/**
* Called when {@link #onScroll(MotionEvent, MotionEvent, float, float)} recognize direction of user gesture as UP.
*/
public abstract void onScrollUp();
/**
* Disable/enable handling of {@link #onScroll(MotionEvent, MotionEvent, float, float)}.
*
* @param ignore true - disable, false - enable
*/
public void setIgnore(boolean ignore) {
mIgnore = ignore;
}
public ScrollDetector(Context context) {
mDetector = new GestureDetector(context, this);
mSlop = getSlop(context);
}
protected int getSlop(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) {
//noinspection deprecation
return ViewConfiguration.getTouchSlop() * 2;
} else {
return ViewConfiguration.get(context).getScaledPagingTouchSlop();
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
mDetector.onTouchEvent(event);
return false;
}
@Override
public boolean onDown(MotionEvent e) {
mDownY = e.getY();
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (mIgnore) {
return false;
}
if (mDirection != distanceY > 0) {
mDirection = !mDirection;
mDownY = e2.getY();
}
float distance = mDownY - e2.getY();
if (distance < -mSlop) {
onScrollDown();
} else if (distance > mSlop) {
onScrollUp();
}
return false;
}
}