diff options
author | Adam Powell <adamp@google.com> | 2010-04-29 11:42:45 -0700 |
---|---|---|
committer | Adam Powell <adamp@google.com> | 2010-04-29 16:46:03 -0700 |
commit | fea5d0250767ab938f623a404e6292a32dd2fdf5 (patch) | |
tree | d0b45aa1feb3e930355f04993558657356f4a577 /src | |
parent | 9d179ade1acabead93b7b96d92709d2c5b8bbc04 (diff) | |
download | packages_apps_trebuchet-fea5d0250767ab938f623a404e6292a32dd2fdf5.zip packages_apps_trebuchet-fea5d0250767ab938f623a404e6292a32dd2fdf5.tar.gz packages_apps_trebuchet-fea5d0250767ab938f623a404e6292a32dd2fdf5.tar.bz2 |
Filter input events and smooth out touch scrolling. Bug 2639807
Change-Id: I71a18497862a30db5ff0f52f566fb86eae213ea3
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher2/CellLayout.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher2/Workspace.java | 46 |
2 files changed, 36 insertions, 12 deletions
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java index 9d39c2c..bc52af1 100644 --- a/src/com/android/launcher2/CellLayout.java +++ b/src/com/android/launcher2/CellLayout.java @@ -584,7 +584,7 @@ public class CellLayout extends ViewGroup { final View view = getChildAt(i); view.setDrawingCacheEnabled(enabled); // Update the drawing caches - view.buildDrawingCache(true); + view.buildDrawingCache(false); } } diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index d84d4cd..dca40ce 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -118,6 +118,10 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag private Drawable mPreviousIndicator; private Drawable mNextIndicator; + + // Touch scrolling history for smoothing + private float[] mLastX = new float[6]; + private int mLastCount = 0; private WorkspaceOvershootInterpolator mScrollInterpolator; @@ -662,7 +666,7 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag // Scroll if the user moved far enough along the X axis mTouchState = TOUCH_STATE_SCROLLING; mLastMotionX = x; - enableChildrenCache(mCurrentScreen - 1, mCurrentScreen + 1); + enableChildrenCache(0, getChildCount()); } // Either way, cancel any pending longpress if (mAllowLongPress) { @@ -751,6 +755,7 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag if (mVelocityTracker != null) { mVelocityTracker.clear(); } + resetFilter(); } } @@ -784,18 +789,16 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag void enableChildrenCache(int fromScreen, int toScreen) { if (fromScreen > toScreen) { - final int temp = fromScreen; - fromScreen = toScreen - 1; + final int temp = fromScreen; + fromScreen = toScreen; toScreen = temp; - } else { - toScreen++; } final int count = getChildCount(); - + fromScreen = Math.max(fromScreen, 0); toScreen = Math.min(toScreen, count - 1); - + for (int i = fromScreen; i <= toScreen; i++) { final CellLayout layout = (CellLayout) getChildAt(i); layout.setChildrenDrawnWithCacheEnabled(true); @@ -810,6 +813,25 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag layout.setChildrenDrawnWithCacheEnabled(false); } } + + private float filterX(float x) { + final float[] lastX = mLastX; + final int len = lastX.length; + final int lastCount = Math.min(len, mLastCount + 1); + + float sum = x; + for (int i = 1; i < lastCount; i++) { + sum += lastX[i] = lastX[i - 1]; + } + lastX[0] = x; + + mLastCount = lastCount; + return sum / lastCount; + } + + private void resetFilter() { + mLastCount = 0; + } @Override public boolean onTouchEvent(MotionEvent ev) { @@ -851,20 +873,20 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag if (mTouchState == TOUCH_STATE_SCROLLING) { // Scroll to follow the motion event final int pointerIndex = ev.findPointerIndex(mActivePointerId); - final float x = ev.getX(pointerIndex); - final int deltaX = (int) (mLastMotionX - x); + final float x = filterX(ev.getX(pointerIndex)); + final float deltaX = mLastMotionX - x; mLastMotionX = x; if (deltaX < 0) { if (mScrollX > 0) { - scrollBy(Math.max(-mScrollX, deltaX), 0); + scrollBy(Math.round(Math.max(-mScrollX, deltaX)), 0); updateWallpaperOffset(); } } else if (deltaX > 0) { final int availableToScroll = getChildAt(getChildCount() - 1).getRight() - mScrollX - getWidth(); if (availableToScroll > 0) { - scrollBy(Math.min(availableToScroll, deltaX), 0); + scrollBy(Math.round(Math.min(availableToScroll, deltaX)), 0); updateWallpaperOffset(); } } else { @@ -902,6 +924,7 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag mVelocityTracker.recycle(); mVelocityTracker = null; } + resetFilter(); } mTouchState = TOUCH_STATE_REST; mActivePointerId = INVALID_POINTER; @@ -909,6 +932,7 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag case MotionEvent.ACTION_CANCEL: mTouchState = TOUCH_STATE_REST; mActivePointerId = INVALID_POINTER; + resetFilter(); break; case MotionEvent.ACTION_POINTER_UP: onSecondaryPointerUp(ev); |