@Override public boolean onTouch(View v, MotionEvent event) { synchronized (this) { int action = event.getAction() & MotionEvent.ACTION_MASK; int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; int pointerId = event.getPointerId(pointerIndex); TouchEvent touchEvent; switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: touchEvent = touchEventPool.newObject(); touchEvent.type = TouchEvent.TOUCH_DOWN; touchEvent.pointer = pointerId; touchEvent.x = touchX[pointerId] = (int) (event.getX(pointerIndex) * scaleX); touchEvent.y = touchY[pointerId] = (int) (event.getY(pointerIndex) * scaleY); touchEvent.xf = touchXf[pointerId] = (float) (event.getX(pointerIndex) * scaleX); touchEvent.yf = touchYf[pointerId] = (float) (event.getY(pointerIndex) * scaleY); isTouched[pointerId] = true; touchEventsBuffer.add(touchEvent); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: case MotionEvent.ACTION_CANCEL: touchEvent = touchEventPool.newObject(); touchEvent.type = TouchEvent.TOUCH_UP; touchEvent.pointer = pointerId; touchEvent.x = touchX[pointerId] = (int) (event.getX(pointerIndex) * scaleX); touchEvent.y = touchY[pointerId] = (int) (event.getY(pointerIndex) * scaleY); touchEvent.xf = touchXf[pointerId] = (float) (event.getX(pointerIndex) * scaleX); touchEvent.yf = touchYf[pointerId] = (float) (event.getY(pointerIndex) * scaleY); isTouched[pointerId] = false; touchEventsBuffer.add(touchEvent); break; case MotionEvent.ACTION_MOVE: int pointerCount = event.getPointerCount(); for (int i = 0; i < pointerCount; i++) { pointerIndex = i; pointerId = event.getPointerId(pointerIndex); touchEvent = touchEventPool.newObject(); touchEvent.type = TouchEvent.TOUCH_DRAGGED; touchEvent.pointer = pointerId; touchEvent.x = touchX[pointerId] = (int) (event.getX(pointerIndex) * scaleX); touchEvent.y = touchY[pointerId] = (int) (event.getY(pointerIndex) * scaleY); touchEvent.xf = touchXf[pointerId] = (float) (event.getX(pointerIndex) * scaleX); touchEvent.yf = touchYf[pointerId] = (float) (event.getY(pointerIndex) * scaleY); touchEventsBuffer.add(touchEvent); } break; } return true; } }
@Override public List<TouchEvent> getTouchEvents() { synchronized (this) { int len = touchEvents.size(); for (int i = 0; i < len; i++) touchEventPool.free(touchEvents.get(i)); touchEvents.clear(); touchEvents.addAll(touchEventsBuffer); touchEventsBuffer.clear(); return touchEvents; } }