Android Open Source - CoreGame Multi Touch Handler






From Project

Back to project page CoreGame.

License

The source code is released under:

Copyright (c) 2011 Andrey Moiseev, http://o2genum.ru Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),...

If you think the Android project CoreGame listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package ru.o2genum.coregame.framework.impl;
//w w  w  .j a va2s .co  m
import java.util.ArrayList;
import java.util.List;

import android.view.MotionEvent;
import android.view.View;
import android.util.*;

import ru.o2genum.coregame.framework.Input.TouchEvent;
import ru.o2genum.coregame.framework.Pool;
import ru.o2genum.coregame.framework.Pool.PoolObjectFactory;

public class MultiTouchHandler implements TouchHandler {
    boolean[] isTouched = new boolean[20];
    int[] touchX = new int[20];
    int[] touchY = new int[20];
    Pool<TouchEvent> touchEventPool;
    List<TouchEvent> touchEvents = new ArrayList<TouchEvent>();
    List<TouchEvent> touchEventsBuffer = new ArrayList<TouchEvent>();

    public MultiTouchHandler(View view) {
        PoolObjectFactory<TouchEvent> factory = new PoolObjectFactory<TouchEvent>() {
            @Override
            public TouchEvent createObject() {
                return new TouchEvent();
            }
        };
        touchEventPool = new Pool<TouchEvent>(factory, 100);
        view.setOnTouchListener(this);
    }

    @Override
    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 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);
                touchEvent.y = touchY[pointerId] = (int) event
                        .getY(pointerIndex);
                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);
                touchEvent.y = touchY[pointerId] = (int) event
                        .getY(pointerIndex);
                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);
                    touchEvent.y = touchY[pointerId] = (int) event
                            .getY(pointerIndex);
                    touchEventsBuffer.add(touchEvent);
                }
                break;
            }

            return true;
        }
    }

    @Override
    public boolean isTouchDown() {
        synchronized (this) {
      return (getMaxPointer() >= 0);
        }
    }

    @Override
    public int getTouchX() {
        synchronized (this) {
  int pointer = getMaxPointer();
            if (pointer < 0 || pointer >= 20)
                return 0;
            else
                return touchX[pointer];
        }
    }

    @Override
    public int getTouchY() {
        synchronized (this) {
  int pointer = getMaxPointer();
            if (pointer < 0 || pointer >= 20)
                return 0;
            else
                return touchY[pointer];
        }
    }

    @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;
        }
    }

  private int getMaxPointer()
  {
    for(int i = 20 - 1; i >= 0; i--)
    {
      if(isTouched[i])
      return i;
    }
    return -1;
  }
}




Java Source Code List

ru.o2genum.coregame.framework.Audio.java
ru.o2genum.coregame.framework.FileIO.java
ru.o2genum.coregame.framework.Game.java
ru.o2genum.coregame.framework.Graphics.java
ru.o2genum.coregame.framework.Input.java
ru.o2genum.coregame.framework.Pool.java
ru.o2genum.coregame.framework.Screen.java
ru.o2genum.coregame.framework.Sound.java
ru.o2genum.coregame.framework.Vibration.java
ru.o2genum.coregame.framework.impl.AndroidAudio.java
ru.o2genum.coregame.framework.impl.AndroidFastRenderView.java
ru.o2genum.coregame.framework.impl.AndroidFileIO.java
ru.o2genum.coregame.framework.impl.AndroidGame.java
ru.o2genum.coregame.framework.impl.AndroidGraphics.java
ru.o2genum.coregame.framework.impl.AndroidInput.java
ru.o2genum.coregame.framework.impl.AndroidOrientationHandler.java
ru.o2genum.coregame.framework.impl.AndroidSound.java
ru.o2genum.coregame.framework.impl.AndroidVibration.java
ru.o2genum.coregame.framework.impl.KeyboardHandler.java
ru.o2genum.coregame.framework.impl.MultiTouchHandler.java
ru.o2genum.coregame.framework.impl.OrientationHandler.java
ru.o2genum.coregame.framework.impl.SingleTouchHandler.java
ru.o2genum.coregame.framework.impl.TouchHandler.java
ru.o2genum.coregame.game.Core.java
ru.o2genum.coregame.game.Dot.java
ru.o2genum.coregame.game.GameActivity.java
ru.o2genum.coregame.game.GameScreen.java
ru.o2genum.coregame.game.VectorF.java
ru.o2genum.coregame.game.World.java