Fix all apps tab fling detection

It is a regression when we changed from ViewPager to PagedView.
Unlike ViewPager, PagedView does not take "yDiff" into account
when determining should it intercept its child MotionEvent.

Override determineScrollingStart, just like what we did in Workspace

Change-Id: I25f7415c45c370629558d944f59bf95c741b9319
FIX: 73878167
This commit is contained in:
Tony Mak
2018-02-27 17:19:34 +00:00
parent 7eadfc4f15
commit 2e564400ba
2 changed files with 40 additions and 1 deletions

View File

@@ -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<PersonalWorkSlidingTabStrip> {
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<PersonalWorkSlidingTabStrip> {
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);
}
}
}