让最后一根手指触摸屏幕

时间:2015-03-02 16:55:27

标签: java android multi-touch motionevent

我需要做控制,我遇到多点触控问题。

这个概念很简单:

  • 如果用户触摸左侧(屏幕的一半)侧,则船向左侧
  • 如果用户触摸右侧(屏幕的一半)侧,则船向右侧移动。

当用户执行以下操作时出现问题:

  • 将手指放在左侧
  • 不移除左手指,将手指放在右侧
  • 删除左手指
  • 再次放左手指(我的代码不会识别它,有问题)

我想要的代码只能获得' 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;
}

3 个答案:

答案 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();
}