package org.andengine.input.touch.controller;
import android.view.MotionEvent;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 20:23:33 - 13.07.2010
*/
public class MultiTouchController extends BaseTouchController {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
// ===========================================================
// Constructors
// ===========================================================
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
public void onHandleMotionEvent(final MotionEvent pMotionEvent) {
final int action = pMotionEvent.getAction() & MotionEvent.ACTION_MASK;
switch(action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
this.onHandleTouchAction(MotionEvent.ACTION_DOWN, pMotionEvent);
return;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
this.onHandleTouchAction(MotionEvent.ACTION_UP, pMotionEvent);
return;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
this.onHandleTouchAction(action, pMotionEvent);
return;
case MotionEvent.ACTION_MOVE:
this.onHandleTouchMove(pMotionEvent);
return;
default:
throw new IllegalArgumentException("Invalid Action detected: " + action);
}
}
// ===========================================================
// Methods
// ===========================================================
private void onHandleTouchMove(final MotionEvent pMotionEvent) {
for(int i = pMotionEvent.getPointerCount() - 1; i >= 0; i--) {
final int pointerIndex = i;
final int pointerID = pMotionEvent.getPointerId(pointerIndex);
this.fireTouchEvent(pMotionEvent.getX(pointerIndex), pMotionEvent.getY(pointerIndex), MotionEvent.ACTION_MOVE, pointerID, pMotionEvent);
}
}
private void onHandleTouchAction(final int pAction, final MotionEvent pMotionEvent) {
final int pointerIndex = MultiTouchController.getPointerIndex(pMotionEvent);
final int pointerID = pMotionEvent.getPointerId(pointerIndex);
this.fireTouchEvent(pMotionEvent.getX(pointerIndex), pMotionEvent.getY(pointerIndex), pAction, pointerID, pMotionEvent);
}
private static int getPointerIndex(final MotionEvent pMotionEvent) {
return (pMotionEvent.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}