From ece0db88abd0a33969bebe63e8f635aafbdcc499 Mon Sep 17 00:00:00 2001 From: seven332 Date: Sat, 4 Jul 2015 20:35:48 +0800 Subject: [PATCH] Swipe on PreviewLayout to page --- .../hippo/ehviewer/widget/PreviewLayout.java | 97 +++++++++++-------- 1 file changed, 57 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/widget/PreviewLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/PreviewLayout.java index 6ce515548..5c2df200f 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/PreviewLayout.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/PreviewLayout.java @@ -19,10 +19,10 @@ package com.hippo.ehviewer.widget; import android.content.Context; import android.support.annotation.NonNull; import android.util.AttributeSet; -import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; @@ -40,7 +40,6 @@ import com.hippo.widget.SimpleGridLayout; public final class PreviewLayout extends LinearLayout implements View.OnClickListener, AccurateClick.OnAccurateClickListener { - private GestureDetector mGestureDetector; private PreviewSet[] mPreviewSets; private int mGid; private Conaco mConaco; @@ -64,6 +63,11 @@ public final class PreviewLayout extends LinearLayout implements View.OnClickLis private PreviewHelper mPreviewHelper; + private float mTouchX; + private float mTouchY; + private boolean mGetScrollX = false; + private int mTouchSlop = -1; + public PreviewLayout(Context context) { super(context); init(context); @@ -110,10 +114,6 @@ public final class PreviewLayout extends LinearLayout implements View.OnClickLis AccurateClick.setOnAccurateClickListener(mTopSelection, this); AccurateClick.setOnAccurateClickListener(mBottomSelection, this); - GestureListener gestureListener = new GestureListener(); - mGestureDetector = new GestureDetector(context, gestureListener); - mGestureDetector.setIsLongpressEnabled(false); - mViewTransition = new ViewTransition(mSimpleGridLayout, mProgressBar); } @@ -155,16 +155,62 @@ public final class PreviewLayout extends LinearLayout implements View.OnClickLis @Override public boolean onInterceptTouchEvent(MotionEvent ev) { - return handleTouchEvent(ev); + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + mTouchX = ev.getX(); + mTouchY = ev.getY(); + mGetScrollX = false; + return false; + case MotionEvent.ACTION_MOVE: + float x = ev.getX(); + float y = ev.getY(); + + if (mTouchSlop == -1) { + mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); + } + + if (Math.hypot(mTouchX - x, mTouchY - y) > mTouchSlop && Math.abs(mTouchX - x) > Math.abs(mTouchY - y)) { + return true; + } else { + return false; + } + } + + return false; } @Override public boolean onTouchEvent(@NonNull MotionEvent event) { - return handleTouchEvent(event); - } + int action = event.getAction(); + switch (action) { + case MotionEvent.ACTION_DOWN: + mTouchX = event.getX(); + mTouchY = event.getY(); + mGetScrollX = false; + break; + case MotionEvent.ACTION_MOVE: + case MotionEvent.ACTION_UP: + float x = event.getX(); + float y = event.getY(); - private boolean handleTouchEvent(MotionEvent event) { - return mGestureDetector.onTouchEvent(event); + if (mTouchSlop == -1) { + mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); + } + + int slop = action == MotionEvent.ACTION_MOVE ? mTouchSlop * 2 : mTouchSlop; + if (!mGetScrollX && Math.hypot(mTouchX - x, mTouchY - y) > slop && Math.abs(mTouchX - x) > Math.abs(mTouchY - y)) { + mGetScrollX = true; + if (mTouchX - x > 0) { + tryNextPreview(); + } else { + tryPreviousPreview(); + } + } + + break; + } + + return true; } public void setPreviewHelper(PreviewHelper previewHelper) { @@ -263,35 +309,6 @@ public final class PreviewLayout extends LinearLayout implements View.OnClickLis } } - class GestureListener extends GestureDetector.SimpleOnGestureListener { - - private boolean mHasScrollX = false; - - @Override - public boolean onDown(MotionEvent e) { - mHasScrollX = false; - return false; - } - - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, - float distanceX, float distanceY) { - if (Math.abs(distanceX) > Math.abs(distanceY)) { - if (!mHasScrollX) { - mHasScrollX = true; - if (distanceX > 0) { - tryNextPreview(); - } else { - tryPreviousPreview(); - } - } - return true; - } else { - return false; - } - } - } - public interface PreviewHelper { void onRequstPreview(PreviewLayout previewLayout, int index);