am 26c5686b: Merge "Better handling of multiple touch events in GlowPadView" into jb-mr1-dev

* commit '26c5686b7e3bf0ba238c55caa3e86447bab7cc61':
  Better handling of multiple touch events in GlowPadView
This commit is contained in:
Jim Miller
2012-09-24 09:29:22 -07:00
committed by Android Git Automerger

View File

@ -196,6 +196,7 @@ public class GlowPadView extends View {
private Tweener mBackgroundAnimator; private Tweener mBackgroundAnimator;
private PointCloud mPointCloud; private PointCloud mPointCloud;
private float mInnerRadius; private float mInnerRadius;
private int mPointerId;
public GlowPadView(Context context) { public GlowPadView(Context context) {
this(context, null); this(context, null);
@ -736,9 +737,10 @@ public class GlowPadView extends View {
@Override @Override
public boolean onTouchEvent(MotionEvent event) { public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction(); final int action = event.getActionMasked();
boolean handled = false; boolean handled = false;
switch (action) { switch (action) {
case MotionEvent.ACTION_POINTER_DOWN:
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
if (DEBUG) Log.v(TAG, "*** DOWN ***"); if (DEBUG) Log.v(TAG, "*** DOWN ***");
handleDown(event); handleDown(event);
@ -752,6 +754,7 @@ public class GlowPadView extends View {
handled = true; handled = true;
break; break;
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
if (DEBUG) Log.v(TAG, "*** UP ***"); if (DEBUG) Log.v(TAG, "*** UP ***");
handleMove(event); handleMove(event);
@ -765,6 +768,7 @@ public class GlowPadView extends View {
handleCancel(event); handleCancel(event);
handled = true; handled = true;
break; break;
} }
invalidate(); invalidate();
return handled ? true : super.onTouchEvent(event); return handled ? true : super.onTouchEvent(event);
@ -776,19 +780,24 @@ public class GlowPadView extends View {
} }
private void handleDown(MotionEvent event) { private void handleDown(MotionEvent event) {
float eventX = event.getX(); int actionIndex = event.getActionIndex();
float eventY = event.getY(); float eventX = event.getX(actionIndex);
float eventY = event.getY(actionIndex);
switchToState(STATE_START, eventX, eventY); switchToState(STATE_START, eventX, eventY);
if (!trySwitchToFirstTouchState(eventX, eventY)) { if (!trySwitchToFirstTouchState(eventX, eventY)) {
mDragging = false; mDragging = false;
} else { } else {
mPointerId = event.getPointerId(actionIndex);
updateGlowPosition(eventX, eventY); updateGlowPosition(eventX, eventY);
} }
} }
private void handleUp(MotionEvent event) { private void handleUp(MotionEvent event) {
if (DEBUG && mDragging) Log.v(TAG, "** Handle RELEASE"); if (DEBUG && mDragging) Log.v(TAG, "** Handle RELEASE");
switchToState(STATE_FINISH, event.getX(), event.getY()); int actionIndex = event.getActionIndex();
if (event.getPointerId(actionIndex) == mPointerId) {
switchToState(STATE_FINISH, event.getX(actionIndex), event.getY(actionIndex));
}
} }
private void handleCancel(MotionEvent event) { private void handleCancel(MotionEvent event) {
@ -801,7 +810,9 @@ public class GlowPadView extends View {
// mActiveTarget = -1; // Drop the active target if canceled. // mActiveTarget = -1; // Drop the active target if canceled.
switchToState(STATE_FINISH, event.getX(), event.getY()); int actionIndex = event.findPointerIndex(mPointerId);
actionIndex = actionIndex == -1 ? 0 : actionIndex;
switchToState(STATE_FINISH, event.getX(actionIndex), event.getY(actionIndex));
} }
private void handleMove(MotionEvent event) { private void handleMove(MotionEvent event) {
@ -811,9 +822,17 @@ public class GlowPadView extends View {
int ntargets = targets.size(); int ntargets = targets.size();
float x = 0.0f; float x = 0.0f;
float y = 0.0f; float y = 0.0f;
int actionIndex = event.findPointerIndex(mPointerId);
if (actionIndex == -1) {
return; // no data for this pointer
}
for (int k = 0; k < historySize + 1; k++) { for (int k = 0; k < historySize + 1; k++) {
float eventX = k < historySize ? event.getHistoricalX(k) : event.getX(); float eventX = k < historySize ? event.getHistoricalX(actionIndex, k)
float eventY = k < historySize ? event.getHistoricalY(k) : event.getY(); : event.getX(actionIndex);
float eventY = k < historySize ? event.getHistoricalY(actionIndex, k)
: event.getY(actionIndex);
// tx and ty are relative to wave center // tx and ty are relative to wave center
float tx = eventX - mWaveCenterX; float tx = eventX - mWaveCenterX;
float ty = eventY - mWaveCenterY; float ty = eventY - mWaveCenterY;