package net.osmand.plus.widgets; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.support.v4.view.MotionEventCompat; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ViewConfiguration; import android.widget.FrameLayout; import net.osmand.plus.widgets.tools.SwipeDismissTouchListener; public class InterceptorFrameLayout extends FrameLayout { private int mTouchSlop; private boolean mIsScrolling; private float mDownX; private SwipeDismissTouchListener listener; public InterceptorFrameLayout(Context context) { this(context, null); } public InterceptorFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); ViewConfiguration vc = ViewConfiguration.get(context); mTouchSlop = vc.getScaledTouchSlop(); } public InterceptorFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); ViewConfiguration vc = ViewConfiguration.get(context); mTouchSlop = vc.getScaledTouchSlop(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public InterceptorFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); ViewConfiguration vc = ViewConfiguration.get(context); mTouchSlop = vc.getScaledTouchSlop(); } public void setListener(SwipeDismissTouchListener listener) { this.listener = listener; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = MotionEventCompat.getActionMasked(ev); if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { mIsScrolling = false; return false; } switch (action) { case MotionEvent.ACTION_DOWN: mDownX = ev.getRawX(); if(listener != null) { listener.onTouch(this, ev); } return false; case MotionEvent.ACTION_MOVE: if (mIsScrolling) { return true; } final int xDiff = calculateDistanceX(ev); if (Math.abs(xDiff) > mTouchSlop) { mIsScrolling = true; return true; } break; } return false; } private int calculateDistanceX(MotionEvent ev) { return (int) (ev.getRawX() - mDownX); } }