I need to do controls, and I am having problem with multi touch.
The concept is easy:
The problems come when the user does the following:
I want a code that only get the 'X' position of the last finger in the screen
My actual code:
@Override
public boolean onTouchEvent(MotionEvent event)
{
int index = MotionEventCompat.getPointerCount(event) - 1;
float x = (int) MotionEventCompat.getX(event, index);
@SuppressWarnings("deprecation")
int ancho = AEngine.display.getWidth();
switch (MotionEventCompat.getActionMasked(event))
{
case MotionEvent.ACTION_DOWN:
if (gameView != null)
gameView.touchNave(x, ancho);
break;
case MotionEvent.ACTION_POINTER_DOWN:
if (gameView != null)
gameView.touchNave(x, ancho);
break;
case MotionEvent.ACTION_MOVE:
if (gameView != null)
gameView.touchNave(x, ancho);
break;
case MotionEvent.ACTION_UP:
Nave.estado = AEngine.NAVE_STAY;
break;
case MotionEvent.ACTION_POINTER_UP:
Nave.estado = AEngine.NAVE_STAY;
break;
}
return false;
}
I made it by using a LinkedHashMap and using the last item of it code:
LinkedHashMap<Integer, Float> al = new LinkedHashMap<Integer, Float>();
@Override
public boolean onTouchEvent(MotionEvent event)
{
int index = MotionEventCompat.getActionIndex(event);
int id = event.getPointerId(index);
float x = (int) MotionEventCompat.getX(event, index);
@SuppressWarnings("deprecation")
int ancho = AEngine.display.getWidth();
switch (MotionEventCompat.getActionMasked(event))
{
case MotionEvent.ACTION_DOWN:
anadir(id,x);
break;
case MotionEvent.ACTION_POINTER_DOWN:
anadir(id,x);
break;
case MotionEvent.ACTION_UP:
al.remove(id);
break;
case MotionEvent.ACTION_POINTER_UP:
al.remove(id);
break;
}
if(al.size() > 0)
{
if (gameView != null)
gameView.touchNave(getX(al), ancho);
}
else
{
Nave.estado = AEngine.NAVE_STAY;
}
return false;
}
public float getX(LinkedHashMap<Integer,Float> map) {
Iterator<Map.Entry<Integer,Float>> iterator = map.entrySet().iterator();
float x = 0;
while (iterator.hasNext()) {
x = iterator.next().getValue();
}
return x;
}
public void anadir(int id,float x)
{
if (al.size() > 0 || !al.containsKey(id))
{
al.put(id, x);
Log.e("WTF",Integer.toString(id)+ "añadido");
}
}