Game Development Reference
In-Depth Information
boolean
[] isTouched=
new boolean
[
MAX_TOUCHPOINTS
];
int
[] touchX=
new int
[
MAX_TOUCHPOINTS
];
int
[] touchY=
new int
[
MAX_TOUCHPOINTS
];
int
[] id=
new int
[
MAX_TOUCHPOINTS
];
Pool<TouchEvent>touchEventPool;
List<TouchEvent>touchEvents=
new
ArrayList<TouchEvent>();
List<TouchEvent>touchEventsBuffer=
new
ArrayList<TouchEvent>();
float
scaleX;
float
scaleY;
public
MultiTouchHandler(View view,
float
scaleX,
float
scaleY) {
PoolObjectFactory<TouchEvent>factory=
new
PoolObjectFactory<TouchEvent>() {
public
TouchEvent createObject() {
return new
TouchEvent();
}
};
touchEventPool=
new
Pool<TouchEvent>(factory, 100);
view.setOnTouchListener(
this
);
this
.scaleX=scaleX;
this
.scaleY=scaleY;
}
public boolean
onTouch(View v, MotionEvent event) {
synchronized
(
this
) {
int
action=event.getAction() & MotionEvent.
ACTION_MASK
;
int
pointerIndex=(event.getAction() & MotionEvent.
ACTION_POINTER_ID_MASK
)
>>MotionEvent.
ACTION_POINTER_ID_SHIFT
;
int
pointerCount=event.getPointerCount();
TouchEvent touchEvent;
for
(
int
i=0; i<
MAX_TOUCHPOINTS
; i++) {
if
(i >= pointerCount) {
isTouched[i]=
false
;
id[i]=-1;
continue
;
}
int
pointerId=event.getPointerId(i);
if
(event.getAction() != MotionEvent.
ACTION_MOVE
&& i != pointerIndex) {
// if it's an up/down/cancel/out event, mask the id to see if we should
process it for this touch
// point
continue
;
}
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[i]=(
int
) (event.getX(i) * scaleX);
touchEvent.y=touchY[i]=(
int
) (event.getY(i) * scaleY);
isTouched[i]=
true
;