Merge "Fix 3237665: Home screen should scroll on tap, not touch down" into honeycomb

This commit is contained in:
Patrick Dubroy
2011-01-19 20:58:09 -08:00
committed by Android (Google) Code Review
2 changed files with 49 additions and 25 deletions
+19 -12
View File
@@ -696,6 +696,20 @@ public abstract class PagedView extends ViewGroup {
super.requestDisallowInterceptTouchEvent(disallowIntercept); super.requestDisallowInterceptTouchEvent(disallowIntercept);
} }
/**
* Return true if a tap at (x, y) should trigger a flip to the previous page.
*/
protected boolean hitsPreviousPage(float x, float y) {
return (x < getRelativeChildOffset(mCurrentPage) - mPageSpacing);
}
/**
* Return true if a tap at (x, y) should trigger a flip to the next page.
*/
protected boolean hitsNextPage(float x, float y) {
return (x > (getMeasuredWidth() - getRelativeChildOffset(mCurrentPage) + mPageSpacing));
}
@Override @Override
public boolean onInterceptTouchEvent(MotionEvent ev) { public boolean onInterceptTouchEvent(MotionEvent ev) {
/* /*
@@ -761,14 +775,11 @@ public abstract class PagedView extends ViewGroup {
// check if this can be the beginning of a tap on the side of the pages // check if this can be the beginning of a tap on the side of the pages
// to scroll the current page // to scroll the current page
if ((mTouchState != TOUCH_STATE_PREV_PAGE) && !handlePagingClicks() && if (mTouchState != TOUCH_STATE_PREV_PAGE && mTouchState != TOUCH_STATE_NEXT_PAGE) {
(mTouchState != TOUCH_STATE_NEXT_PAGE)) {
if (getChildCount() > 0) { if (getChildCount() > 0) {
int width = getMeasuredWidth(); if (hitsPreviousPage(x, y)) {
int offset = getRelativeChildOffset(mCurrentPage);
if (x < offset - mPageSpacing) {
mTouchState = TOUCH_STATE_PREV_PAGE; mTouchState = TOUCH_STATE_PREV_PAGE;
} else if (x > (width - offset + mPageSpacing)) { } else if (hitsNextPage(x, y)) {
mTouchState = TOUCH_STATE_NEXT_PAGE; mTouchState = TOUCH_STATE_NEXT_PAGE;
} }
} }
@@ -856,10 +867,6 @@ public abstract class PagedView extends ViewGroup {
} }
} }
protected boolean handlePagingClicks() {
return false;
}
// This curve determines how the effect of scrolling over the limits of the page dimishes // This curve determines how the effect of scrolling over the limits of the page dimishes
// as the user pulls further and further from the bounds // as the user pulls further and further from the bounds
private float overScrollInfluenceCurve(float f) { private float overScrollInfluenceCurve(float f) {
@@ -966,7 +973,7 @@ public abstract class PagedView extends ViewGroup {
} else { } else {
snapToDestination(); snapToDestination();
} }
} else if (mTouchState == TOUCH_STATE_PREV_PAGE && !handlePagingClicks()) { } else if (mTouchState == TOUCH_STATE_PREV_PAGE) {
// at this point we have not moved beyond the touch slop // at this point we have not moved beyond the touch slop
// (otherwise mTouchState would be TOUCH_STATE_SCROLLING), so // (otherwise mTouchState would be TOUCH_STATE_SCROLLING), so
// we can just page // we can just page
@@ -976,7 +983,7 @@ public abstract class PagedView extends ViewGroup {
} else { } else {
snapToDestination(); snapToDestination();
} }
} else if (mTouchState == TOUCH_STATE_NEXT_PAGE && !handlePagingClicks()) { } else if (mTouchState == TOUCH_STATE_NEXT_PAGE) {
// at this point we have not moved beyond the touch slop // at this point we have not moved beyond the touch slop
// (otherwise mTouchState would be TOUCH_STATE_SCROLLING), so // (otherwise mTouchState would be TOUCH_STATE_SCROLLING), so
// we can just page // we can just page
+30 -13
View File
@@ -465,6 +465,36 @@ public class Workspace extends SmoothPagedView
} }
} }
/**
* Check if the point (x, y) hits a given page.
*/
private boolean hitsPage(int index, float x, float y) {
final View page = getChildAt(index);
if (page != null) {
float[] localXY = { x, y };
mapPointFromSelfToChild(page, localXY);
return (localXY[0] >= 0 && localXY[0] < page.getWidth()
&& localXY[1] >= 0 && localXY[1] < page.getHeight());
}
return false;
}
@Override
protected boolean hitsPreviousPage(float x, float y) {
// mNextPage is set to INVALID_PAGE whenever we are stationary.
// Calculating "next page" this way ensures that you scroll to whatever page you tap on
final int current = (mNextPage == INVALID_PAGE) ? mCurrentPage : mNextPage;
return hitsPage(current - 1, x, y);
}
@Override
protected boolean hitsNextPage(float x, float y) {
// mNextPage is set to INVALID_PAGE whenever we are stationary.
// Calculating "next page" this way ensures that you scroll to whatever page you tap on
final int current = (mNextPage == INVALID_PAGE) ? mCurrentPage : mNextPage;
return hitsPage(current + 1, x, y);
}
public boolean onTouch(View v, MotionEvent event) { public boolean onTouch(View v, MotionEvent event) {
// this is an intercepted event being forwarded from a cell layout // this is an intercepted event being forwarded from a cell layout
if (mIsSmall || mIsInUnshrinkAnimation) { if (mIsSmall || mIsInUnshrinkAnimation) {
@@ -473,14 +503,6 @@ public class Workspace extends SmoothPagedView
mLauncher.onWorkspaceClick((CellLayout) v); mLauncher.onWorkspaceClick((CellLayout) v);
} }
return true; return true;
} else if (!mPageMoving) {
if (v == getChildAt(mCurrentPage - 1)) {
snapToPage(mCurrentPage - 1);
return true;
} else if (v == getChildAt(mCurrentPage + 1)) {
snapToPage(mCurrentPage + 1);
return true;
}
} }
return false; return false;
} }
@@ -1482,11 +1504,6 @@ public class Workspace extends SmoothPagedView
updateWhichPagesAcceptDrops(mShrinkState); updateWhichPagesAcceptDrops(mShrinkState);
} }
@Override
protected boolean handlePagingClicks() {
return true;
}
// We call this when we trigger an unshrink by clicking on the CellLayout cl // We call this when we trigger an unshrink by clicking on the CellLayout cl
public void unshrink(CellLayout clThatWasClicked) { public void unshrink(CellLayout clThatWasClicked) {
unshrink(clThatWasClicked, false); unshrink(clThatWasClicked, false);