Android Open Source - Hungry-Mouse Multi Touch Handler






From Project

Back to project page Hungry-Mouse.

License

The source code is released under:

MIT License

If you think the Android project Hungry-Mouse 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

//Name:   MultiTouchHandler.java
//Purpose:  used to get multiple touches on the touch screen
//from ww  w .j ava  2 s.  c o  m
package com.hungry.mouse.framework.implementation;

import com.hungry.mouse.framework.Pool;
import com.hungry.mouse.framework.Input.TouchEvent;
import com.hungry.mouse.framework.Pool.PoolObjectFactory;

//java libraries
import java.util.ArrayList;//implementation of list with additional operations add,remove,replace
import java.util.List;//a collection which maintain an ordering for its elements

//android libraries stored in SDK platform
import android.view.MotionEvent;//report movement events
import android.view.View;//represents basic building block for user interface components



public class MultiTouchHandler implements TouchHandler {
  private static final int MAX_TOUCHPOINTS = 10;
  
  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;

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

    this.scaleX = scaleX;
    this.scaleY = scaleY;
  }

  //handle multiple touches
  @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 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;
          id[i] = pointerId;
          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[i] = (int) (event.getX(i) * scaleX);
          touchEvent.y = touchY[i] = (int) (event.getY(i) * scaleY);
          isTouched[i] = false;
          id[i] = -1;
          touchEventsBuffer.add(touchEvent);
          break;

        case MotionEvent.ACTION_MOVE:
          touchEvent = touchEventPool.newObject();
          touchEvent.type = TouchEvent.TOUCH_DRAGGED;
          touchEvent.pointer = pointerId;
          touchEvent.x = touchX[i] = (int) (event.getX(i) * scaleX);
          touchEvent.y = touchY[i] = (int) (event.getY(i) * scaleY);
          isTouched[i] = true;
          id[i] = pointerId;
          touchEventsBuffer.add(touchEvent);
          break;
        }
      }
      return true;
    }
  }

  //check for touch and do error check
  @Override
  public boolean isTouchDown(int pointer) {
    synchronized (this) {
      int index = getIndex(pointer);
      if (index < 0 || index >= MAX_TOUCHPOINTS)
        return false;
      else
        return isTouched[index];
    }
  }

  //get x axis coordinates and do error check
  @Override
  public int getTouchX(int pointer) {
    synchronized (this) {
      int index = getIndex(pointer);
      if (index < 0 || index >= MAX_TOUCHPOINTS)
        return 0;
      else
        return touchX[index];
    }
  }
  
  //get y axis coordinates and do error check
  @Override
  public int getTouchY(int pointer) {
    synchronized (this) {
      int index = getIndex(pointer);
      if (index < 0 || index >= MAX_TOUCHPOINTS)
        return 0;
      else
        return touchY[index];
    }
  }

  //get multiple touch events
  @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;
    }
  }
  
  // returns the index for a given pointerId or -1 if no index.
  private int getIndex(int pointerId) {
    for (int i = 0; i < MAX_TOUCHPOINTS; i++) {
      if (id[i] == pointerId) {
        return i;
      }
    }
    return -1;
  }
}




Java Source Code List

com.hungry.mouse.framework.Audio.java
com.hungry.mouse.framework.FileIO.java
com.hungry.mouse.framework.Game.java
com.hungry.mouse.framework.Graphics.java
com.hungry.mouse.framework.Image.java
com.hungry.mouse.framework.Input.java
com.hungry.mouse.framework.Music.java
com.hungry.mouse.framework.Pool.java
com.hungry.mouse.framework.Screen.java
com.hungry.mouse.framework.Sound.java
com.hungry.mouse.framework.implementation.AccelerometerHandler.java
com.hungry.mouse.framework.implementation.AndroidAudio.java
com.hungry.mouse.framework.implementation.AndroidFastRenderView.java
com.hungry.mouse.framework.implementation.AndroidFileIO.java
com.hungry.mouse.framework.implementation.AndroidGame.java
com.hungry.mouse.framework.implementation.AndroidGraphics.java
com.hungry.mouse.framework.implementation.AndroidImage.java
com.hungry.mouse.framework.implementation.AndroidInput.java
com.hungry.mouse.framework.implementation.AndroidMusic.java
com.hungry.mouse.framework.implementation.AndroidSound.java
com.hungry.mouse.framework.implementation.MultiTouchHandler.java
com.hungry.mouse.framework.implementation.SingleTouchHandler.java
com.hungry.mouse.framework.implementation.TouchHandler.java
com.hungry.mouse.main.AboutScreen.java
com.hungry.mouse.main.Animation.java
com.hungry.mouse.main.Assets.java
com.hungry.mouse.main.Background.java
com.hungry.mouse.main.Bomb.java
com.hungry.mouse.main.Cheese.java
com.hungry.mouse.main.Enemy.java
com.hungry.mouse.main.GameScreen.java
com.hungry.mouse.main.HelpScreen1.java
com.hungry.mouse.main.HelpScreen2.java
com.hungry.mouse.main.HelpScreen3.java
com.hungry.mouse.main.HelpScreen4.java
com.hungry.mouse.main.Kamikazi.java
com.hungry.mouse.main.LevelSelectorScreen.java
com.hungry.mouse.main.LoadingScreen.java
com.hungry.mouse.main.MainMenuScreen.java
com.hungry.mouse.main.Mouse.java
com.hungry.mouse.main.Projectile.java
com.hungry.mouse.main.Rewards.java
com.hungry.mouse.main.SampleGame.java
com.hungry.mouse.main.Settings.java
com.hungry.mouse.main.Sign.java
com.hungry.mouse.main.SplashLoadingScreen.java
com.hungry.mouse.main.Tile.java