我需要做控制,我遇到多点触控问题。
这个概念很简单:
当用户执行以下操作时出现问题:
我想要的代码只能获得' X' 最后手指在屏幕中的位置
我的实际代码:
@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;
}
答案 0 :(得分:1)
我认为“屏幕上的最后一根手指”是指具有最新ACTION_DOWN / ACTION_POINTER_DOWN时间的手指。
每次收到DOWN / POINTER_DOWN事件时,请使用方法getActionIndex()
然后getPointerID()
获取操作指针的ID,并将其保存在“lastActionDownId”字段中。
然后,在致电touchNave()
之前,使用findPointerIndex(lastActionDownId)
获取最后一次的索引。然后使用getX(int index)
和该方法调用的结果。
答案 1 :(得分:0)
我是通过使用LinkedHashMap并使用代码的最后一项来实现的:
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");
}
}
答案 2 :(得分:0)
我从来没有想过一个很好的解决方案,我最后写了一个相当冗长的课程。这看起来很奇怪,但是当你想要正确计算手指并解释手指时,如果你给出#1和#2,#3等触摸事件数字,你需要知道手指#2被抬起,因此手指# 1和#3是有效事件,下一次手指触摸再次回到手指#2。
有很多东西有多个手指,以天真的方式做这件事会突然传送到屏幕上的一个手指位置,因为你以不同的顺序拾取了触摸。特别是如果你想存储有关这些接触的信息。
try {
Bitmap bitmap = encodeAsBitmap(STR);
YOURACITVITYNAME.imageView.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}