【问题标题】:Android Multi-touch event problems...No new touch events while dragging?Android 多点触控事件问题...拖动时没有新的触控事件?
【发布时间】:2011-08-12 01:08:46
【问题描述】:

所以我正在尝试制作一个小型太空游戏,您可以使用touchdrag 使用图形屏幕操纵杆 控制飞船。我已经让这个工作正常了。一旦我开始尝试添加触摸屏幕顶部以发射武器的能力,问题就出现了。出于某种原因,如果您当前拖动操纵杆,它似乎会忽略其他触摸输入并且不执行任何操作(但一旦我停止握住joystick,它就可以正常工作)。 这是我第一次使用 java 和 Android,所以这可能是一些愚蠢的事情,但我已经坚持了几天。 无论如何,这是我的代码。

以下内容来自我的

public class Panel extends SurfaceView implements SurfaceHolder.Callback {
    @Override
    public boolean onTouchEvent(MotionEvent event) {    
        fingers= event.getPointerCount();  //Returns 1 or 2 properly if 2 fingers on screen
        playership.onTouchEvent(event); //Pass the event along to the spaceship object
        return true;
        //return super.onTouchEvent(event); //no idea what this does, but it seems to disable the drag event
    }

下面是 playership.onTouchEvent(event);功能

public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) 
    {        
        case MotionEvent.ACTION_DOWN:
            if(event.getY()<(Panel.mHeight-150))
            {
                Laser1.reset(mX,mY,(int)event.getX(),(int)event.getY());
            }
            break;
    }
    joy1.onTouchEvent(event);
    return true;
}

下面是joy1.onTouchEvent(event);

public boolean onTouchEvent(MotionEvent event) {

    int eventaction = event.getAction();

    //Offset between mouse(x,y) and center
    double offx=oX-event.getX();
    double offy=oY-event.getY();
    double d=Math.sqrt((offx*offx)+(offy*offy));

    switch (eventaction ) 
    {        
        case MotionEvent.ACTION_DOWN:
            if(d<dragrange) //Start Dragging if clicked
            {
                offx=offx/d;
                offy=offy/d;
                Dragging=true;
                reset = false;
                dX=(int) (offx*dragrange);
                dY=(int) (offy*dragrange);
            }
            break;
        case MotionEvent.ACTION_MOVE:                
            if(Dragging)//if joy is already being draged, update it.
            {
            offx=offx/d;
                offy=offy/d;
                if(d>dragrange)
                {
                    dX=(int) (offx*dragrange);
                    dY=(int) (offy*dragrange);
                }
                else
                {
                    dX=(int) (offx*d);
                    dY=(int) (offy*d);
                }
                reset = false;
            }
        break;
        case MotionEvent.ACTION_UP:
            if(Dragging)
            {
               Dragging=false;
            }
            break;
    }
    return true;
}

是的,问题是如果操纵杆在MotionEvent.ACTION_MOVE 的案例中间,它似乎会阻止任何其他触摸事件正确注册。

【问题讨论】:

    标签: java android multi-touch touch-event joystick


    【解决方案1】:

    您需要处理检测另一根手指。更具体的处理

    MotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP

    否则你会忽略其他手指。这是我的一个项目中的一些代码,它们完全符合您的要求:

    public void onTouchEvent(MotionEvent event)
    {
        int ptrId = -1;
        int action = event.getAction();
        switch (action & MotionEvent.ACTION_MASK)
        {
            case MotionEvent.ACTION_DOWN:
                down(event.getPointerId(0), (int)event.getX(), (int)event.getY());
            break;
            case MotionEvent.ACTION_UP:
                up(event.getPointerId(0));
            break;
            case MotionEvent.ACTION_POINTER_DOWN:
                ptrId = action >> MotionEvent.ACTION_POINTER_ID_SHIFT;
                int ptrIdx = event.findPointerIndex(ptrId);
                down(ptrId, (int)event.getX(ptrIdx), (int)event.getY(ptrIdx));
            break;
            case MotionEvent.ACTION_POINTER_UP:
                ptrId = action >> MotionEvent.ACTION_POINTER_ID_SHIFT;
                up(ptrId);
            break;
            case MotionEvent.ACTION_MOVE:
                for(int i = 0; i < event.getPointerCount(); ++i)
                    if(event.getPointerId(i) == inputPad.id())
                    {
                        inputPad.position(event.getX(inputPad.id()));
                        player.velocity(inputPad.delta());
                        player.stand();
                        if(enemy != null) {
                            Fighter.collide(player, enemy);
                            enemy.update();
                        }
                        player.update();
                        break;
                    }
            break;
        }
    }
    

    更多解释请参见herehere

    【讨论】:

    • 哦,好吧!,也就是说 onTouchEvent 只被调用一次,即使有两个以上的手指输入?我认为每个输入都会调用一次 onTouchEvent 。谢谢!
    • 实际上 onTouchEvent() 为每个输入调用一次,但您必须在 ACTION_(POINTER_)DOWN/UP 上记录 id 并在每次调用 ACTION_MOVE 时将其与手指的指针 id 进行比较以查看如果是正确的手指。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多