2

私のAndroidアプリには、Viewタッチイベントを受け取るカスタムがあります。ただし、触れるたびに反応するわけではなく、たまにしか反応しません。私の知る限り、画面に触れて指を動かしてから離すと、少しでも動かしてもイベントが発生しますが、画面をタップするのが速すぎて指がスライドできない場合は、イベントが発生します。 、 何も起こりません。どうすればこれを修正できますか?

ビューのコードは次のとおりです。

public class SpeedShooterGameView extends GameActivity.GameView {
    public SpeedShooterGameView(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    @Override
    protected GameThread getNewThread(SurfaceHolder holder, Context context) {
        return new SpeedShooterGameThread(holder, context);
    }

    // Program is driven by screen touches
    public boolean onTouchEvent(MotionEvent event) {
        SpeedShooterGameThread thread = (SpeedShooterGameThread) getThread();
        if (thread.isRunning()) {
            return thread.recieveTouch(event);
        } else {
             return false;
        }
    }
}

行に返されたオブジェクトが期待どおりに機能していることはかなり確信していますSpeedShooterGameThread thread = (SpeedShooterGameThread) getThread();が、上記のコードが正常に見える場合は、そのクラスの関連コードも投稿します。がthread.recieveTouch(event);呼び出されると、MotionEventは別のスレッドに送信されます。

編集:先に進み、次のコードを投稿しますSpeedShooterGameThread

public class SpeedShooterGameThread extends GameActivity.GameView.GameThread {
    //... snip ...
    private Queue<MotionEvent> touchEventQueue;

    //... snip ...

    public synchronized final void newGame() { //called from the constructor, used to go to a known stable state
        //... snip ...
        touchEventQueue = new LinkedList<MotionEvent>();
        //... snip ...
    }

    //...snip...

    public synchronized boolean recieveTouch(MotionEvent event) {
        return touchEventQueue.offer(event);
    }

    private synchronized void processTouchEvents() {
        synchronized (touchEventQueue) {
            while (!touchEventQueue.isEmpty()) {
                MotionEvent event = touchEventQueue.poll();
                if (event == null) {
                    continue;
                }
                //... snip ....
            }
        }
    }

    //... snip ...
}
4

1 に答える 1