Проблемы с мультисенсорным Android-событием ... Нет новых сенсорных событий при перетаскивании? - PullRequest
1 голос
/ 12 августа 2011

Итак, я пытаюсь сделать небольшую космическую игру. Вы управляете кораблем с помощью графического экранного джойстика , используя touch и drag.Я получил это, чтобы работать нормально.Проблема возникает, когда я начал пытаться добавить возможность касаться верхней части экрана, чтобы стрелять из оружия.По какой-то причине, если вы в данный момент перетаскиваете джойстик , он, кажется, игнорирует другой сенсорный ввод и ничего не делает (но он работает нормально, как только я прекращаю удерживать 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 (событие);function

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 (событие);

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похоже, он блокирует любые другие сенсорные события от правильной регистрации.

1 Ответ

5 голосов
/ 12 августа 2011

Вам нужно справиться с обнаружением другого пальца. Более конкретно обработка

MotionEvent.ACTION_POINTER_DOWN и MotionEvent.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;
    }
}

См. здесь и здесь для более подробного объяснения.

...