diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index ccb0a955d3..4be32b2070 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -1892,6 +1892,14 @@ public abstract class PagedView extends ViewGrou getNextPage() + 1, getChildCount()); } + protected float getDownMotionX() { + return mDownMotionX; + } + + protected float getDownMotionY() { + return mDownMotionY; + } + @Override public boolean onHoverEvent(android.view.MotionEvent event) { return true; diff --git a/src/com/android/launcher3/allapps/AllAppsPagedView.java b/src/com/android/launcher3/allapps/AllAppsPagedView.java index 86186fdb5a..3b4450bf8a 100644 --- a/src/com/android/launcher3/allapps/AllAppsPagedView.java +++ b/src/com/android/launcher3/allapps/AllAppsPagedView.java @@ -18,12 +18,17 @@ package com.android.launcher3.allapps; import android.content.Context; import android.util.AttributeSet; +import android.view.MotionEvent; import com.android.launcher3.PagedView; import com.android.launcher3.R; public class AllAppsPagedView extends PagedView { - public AllAppsPagedView(Context context) { + final static float START_DAMPING_TOUCH_SLOP_ANGLE = (float) Math.PI / 6; + final static float MAX_SWIPE_ANGLE = (float) Math.PI / 3; + final static float TOUCH_SLOP_DAMPING_FACTOR = 4; + + public AllAppsPagedView(Context context) { this(context, null); } @@ -46,4 +51,30 @@ public class AllAppsPagedView extends PagedView { super.onScrollChanged(l, t, oldl, oldt); mPageIndicator.setScroll(l, mMaxScrollX); } + + @Override + protected void determineScrollingStart(MotionEvent ev) { + float absDeltaX = Math.abs(ev.getX() - getDownMotionX()); + float absDeltaY = Math.abs(ev.getY() - getDownMotionY()); + + if (Float.compare(absDeltaX, 0f) == 0) return; + + float slope = absDeltaY / absDeltaX; + float theta = (float) Math.atan(slope); + + if (absDeltaX > mTouchSlop || absDeltaY > mTouchSlop) { + cancelCurrentPageLongPress(); + } + + if (theta > MAX_SWIPE_ANGLE) { + return; + } else if (theta > START_DAMPING_TOUCH_SLOP_ANGLE) { + theta -= START_DAMPING_TOUCH_SLOP_ANGLE; + float extraRatio = (float) + Math.sqrt((theta / (MAX_SWIPE_ANGLE - START_DAMPING_TOUCH_SLOP_ANGLE))); + super.determineScrollingStart(ev, 1 + TOUCH_SLOP_DAMPING_FACTOR * extraRatio); + } else { + super.determineScrollingStart(ev); + } + } }