diff options
author | Jeff Brown <jeffbrown@google.com> | 2011-02-24 20:55:35 -0800 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2011-02-25 17:06:07 -0800 |
commit | 33bbfd2232ea9eaae9a9d87a05a95a430f09bd83 (patch) | |
tree | 88e8e2513676dccf07b9764522a681aae370f020 /core/java/com | |
parent | d752c3b3e6c576ed1f18e86a7b18c33dc7c65791 (diff) | |
download | frameworks_base-33bbfd2232ea9eaae9a9d87a05a95a430f09bd83.zip frameworks_base-33bbfd2232ea9eaae9a9d87a05a95a430f09bd83.tar.gz frameworks_base-33bbfd2232ea9eaae9a9d87a05a95a430f09bd83.tar.bz2 |
Add support for mouse hover and scroll wheel.
Dispatch ACTION_HOVER_MOVE and ACTION_SCROLL through the View
hierarchy as onGenericTouchEvent. Pointer events dispatched
this way are delivered to the view under the pointer. Non-pointer
events continue to be delivered to the focused view.
Added scroll wheel support to AbsListView, ScrollView,
HorizontalScrollView and WebView. Shift+VSCROLL is translated
to HSCROLL as appropriate.
Added logging of new pointer events in PointerLocationView.
Fixed a problem in EventHub when a USB device is removed that
resulted in a long stream of ENODEV errors being logged until INotify
noticed the device was gone.
Note that the new events are not supported by wallpapers at this time
because the wallpaper engine only delivers touch events.
Make all mouse buttons behave identically. (Effectively we only
support one button.)
Change-Id: I9ab445ffb63c813fcb07db6693987b02475f3756
Diffstat (limited to 'core/java/com')
-rw-r--r-- | core/java/com/android/internal/widget/PointerLocationView.java | 123 |
1 files changed, 87 insertions, 36 deletions
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java index c72d0e8..5ac903d 100644 --- a/core/java/com/android/internal/widget/PointerLocationView.java +++ b/core/java/com/android/internal/widget/PointerLocationView.java @@ -318,10 +318,56 @@ public class PointerLocationView extends View { } } - private void logPointerCoords(MotionEvent.PointerCoords coords, int id) { + private void logPointerCoords(int action, int index, MotionEvent.PointerCoords coords, int id) { + final String prefix; + switch (action & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: + prefix = "DOWN"; + break; + case MotionEvent.ACTION_UP: + prefix = "UP"; + break; + case MotionEvent.ACTION_MOVE: + prefix = "MOVE"; + break; + case MotionEvent.ACTION_CANCEL: + prefix = "CANCEL"; + break; + case MotionEvent.ACTION_OUTSIDE: + prefix = "OUTSIDE"; + break; + case MotionEvent.ACTION_POINTER_DOWN: + if (index == ((action & MotionEvent.ACTION_POINTER_INDEX_MASK) + >> MotionEvent.ACTION_POINTER_INDEX_SHIFT)) { + prefix = "DOWN"; + } else { + prefix = "MOVE"; + } + break; + case MotionEvent.ACTION_POINTER_UP: + if (index == ((action & MotionEvent.ACTION_POINTER_INDEX_MASK) + >> MotionEvent.ACTION_POINTER_INDEX_SHIFT)) { + prefix = "UP"; + } else { + prefix = "MOVE"; + } + break; + case MotionEvent.ACTION_HOVER_MOVE: + prefix = "HOVER MOVE"; + break; + case MotionEvent.ACTION_SCROLL: + prefix = "SCROLL"; + break; + default: + prefix = Integer.toString(action); + break; + } + Log.i(TAG, mText.clear() .append("Pointer ").append(id + 1) - .append(": (").append(coords.x, 3).append(", ").append(coords.y, 3) + .append(": ") + .append(prefix) + .append(" (").append(coords.x, 3).append(", ").append(coords.y, 3) .append(") Pressure=").append(coords.pressure, 3) .append(" Size=").append(coords.size, 3) .append(" TouchMajor=").append(coords.touchMajor, 3) @@ -335,7 +381,7 @@ public class PointerLocationView extends View { .toString()); } - public void addTouchEvent(MotionEvent event) { + public void addPointerEvent(MotionEvent event) { synchronized (mPointers) { int action = event.getAction(); @@ -363,10 +409,16 @@ public class PointerLocationView extends View { ps.mCurDown = false; } mCurDown = true; + mCurNumPointers = 0; mMaxNumPointers = 0; mVelocity.clear(); } - + + mCurNumPointers += 1; + if (mMaxNumPointers < mCurNumPointers) { + mMaxNumPointers = mCurNumPointers; + } + final int id = event.getPointerId(index); while (NP <= id) { PointerState ps = new PointerState(); @@ -375,49 +427,41 @@ public class PointerLocationView extends View { } if (mActivePointerId < 0 || - ! mPointers.get(mActivePointerId).mCurDown) { + !mPointers.get(mActivePointerId).mCurDown) { mActivePointerId = id; } final PointerState ps = mPointers.get(id); ps.mCurDown = true; - if (mPrintCoords) { - Log.i(TAG, mText.clear().append("Pointer ") - .append(id + 1).append(": DOWN").toString()); - } } - - final int NI = event.getPointerCount(); - final boolean hover = (action == MotionEvent.ACTION_HOVER_MOVE); - mCurDown = action != MotionEvent.ACTION_UP - && action != MotionEvent.ACTION_CANCEL - && !hover; - mCurNumPointers = mCurDown ? NI : 0; - if (mMaxNumPointers < mCurNumPointers) { - mMaxNumPointers = mCurNumPointers; - } + final int NI = event.getPointerCount(); mVelocity.addMovement(event); mVelocity.computeCurrentVelocity(1); - - for (int i=0; i<NI; i++) { - final int id = event.getPointerId(i); - final PointerState ps = hover ? null : mPointers.get(id); - final PointerCoords coords = ps != null ? ps.mCoords : mHoverCoords; - final int N = event.getHistorySize(); - for (int j=0; j<N; j++) { - event.getHistoricalPointerCoords(i, j, coords); + + final int N = event.getHistorySize(); + for (int historyPos = 0; historyPos < N; historyPos++) { + for (int i = 0; i < NI; i++) { + final int id = event.getPointerId(i); + final PointerState ps = mCurDown ? mPointers.get(id) : null; + final PointerCoords coords = ps != null ? ps.mCoords : mHoverCoords; + event.getHistoricalPointerCoords(i, historyPos, coords); if (mPrintCoords) { - logPointerCoords(coords, id); + logPointerCoords(action, i, coords, id); } if (ps != null) { - ps.addTrace(event.getHistoricalX(i, j), event.getHistoricalY(i, j)); + ps.addTrace(coords.x, coords.y); } } + } + for (int i = 0; i < NI; i++) { + final int id = event.getPointerId(i); + final PointerState ps = mCurDown ? mPointers.get(id) : null; + final PointerCoords coords = ps != null ? ps.mCoords : mHoverCoords; event.getPointerCoords(i, coords); if (mPrintCoords) { - logPointerCoords(coords, id); + logPointerCoords(action, i, coords, id); } if (ps != null) { ps.addTrace(coords.x, coords.y); @@ -425,7 +469,7 @@ public class PointerLocationView extends View { ps.mYVelocity = mVelocity.getYVelocity(id); } } - + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL || (action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_UP) { @@ -435,15 +479,13 @@ public class PointerLocationView extends View { final int id = event.getPointerId(index); final PointerState ps = mPointers.get(id); ps.mCurDown = false; - if (mPrintCoords) { - Log.i(TAG, mText.clear().append("Pointer ") - .append(id + 1).append(": UP").toString()); - } if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { mCurDown = false; + mCurNumPointers = 0; } else { + mCurNumPointers -= 1; if (mActivePointerId == id) { mActivePointerId = event.getPointerId(index == 0 ? 1 : 0); } @@ -462,11 +504,20 @@ public class PointerLocationView extends View { @Override public boolean onTouchEvent(MotionEvent event) { - addTouchEvent(event); + addPointerEvent(event); return true; } @Override + public boolean onGenericMotionEvent(MotionEvent event) { + if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { + addPointerEvent(event); + return true; + } + return super.onGenericMotionEvent(event); + } + + @Override public boolean onTrackballEvent(MotionEvent event) { Log.i(TAG, "Trackball: " + event); return super.onTrackballEvent(event); |