7

私は Android でゲームを作成しています。ユーザーが画面を長押ししようとすると、特定のアクションを実行する必要があります。残念ながら、カスタム SurfaceView で直接動作するメソッドは見つかりませんでした。そのようなメソッドが存在するかどうか教えてください :)

そこで、onTouch イベント リスナーからロング タッチ検出を実装することにしました。

ここに私のコードがあります:

@Override
    public boolean onTouch(View v, MotionEvent event)
    {
        long touchDuration = 0;


            if ( event.getAction() == MotionEvent.ACTION_DOWN )
            {
                //Start timer
                touchTime = System.currentTimeMillis();


            }else if ( event.getAction() == MotionEvent.ACTION_UP )
            {
                //stop timer
                touchDuration = System.currentTimeMillis() - touchTime;

                if ( touchDuration < 800 )
                {
                    onShortTouch(event,touchDuration);
                }else
                {
                    onLongTouch(event,touchDuration);
                }
            }
        }

        return true;

これは機能しますが、ユーザーが電話に触れるのをやめたときだけに、プレスが長押しされたかどうかを検出できます。だから、それはまさに私が欲しいものではありません。ユーザーが最初に画面に触れたときにタイマーが開始され、800 ミリ秒が経過すると LongTouch() メソッドが呼び出されることをお勧めします。つまり、ACTION_DOWN から ACTION_UP までの時間が経過したかどうかを確認する必要はありません。上記のタイマーにスレッドを使用する必要があると思いますが、機能させることはできません。次のコードを使用すると、画面に触れるとすぐにデバッグ メッセージが表示されます。

        @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        long touchDuration = 0;

            TouchThread touchThread = new TouchThread();

            if ( event.getAction() == MotionEvent.ACTION_DOWN )
            {
                //Start timer
                touchTime = System.currentTimeMillis();
                touchThread.setEvent(event);
                touchThread.run();  
            }

        return true;
    }


    private class TouchThread extends Thread
    {

            public MotionEvent event = null;

            public void setEvent(MotionEvent e)
            {
                event = e;
            }

            @Override
            public void run()
            {
                long startTime = System.currentTimeMillis();
                long time = 0;

                while(event.getAction() == MotionEvent.ACTION_DOWN)
                {
                    time = System.currentTimeMillis() - startTime;
                    if( time > 800 )
                    {
                        System.out.println("LOOONG CLICK!!");
                        return;
                    }
                }
            }
    }

誰かが何か考えを持っていますか? 他の解決策も歓迎します。

ありがとう。

4

3 に答える 3

4

実はとても簡単です。ビューのコンストラクターで、次のようにします。

setOnLongClickListener(new View.OnLongClickListener() 
{
   public boolean onLongClick(View v) {
        Log.v( "debug", "LONG CLICK!" );
        return true;
     }
  }
);

次に、onTouchEvent をオーバーライドします。

  @Override
  public boolean onTouchEvent(MotionEvent event) {
      super.onTouchEvent(event);
  }

そして、あなたは設定されています;)。

于 2012-04-06T08:39:49.210 に答える
3

手動のイベント処理も行いたい場合の便利なオプションは、GestureDetector クラスです: http://developer.android.com/reference/android/view/GestureDetector.html

私がそれを使用する方法は、コンストラクターで GestureDetector インスタンスを作成し、興味のあるメソッドを実装してから、 onTouchEvent() メソッドの開始時に次のようなことを行うことです。

    if (gestureDetector.onTouchEvent(event)) {
        return true;
    }

これは、ほとんどの場合、残りのタッチ処理を中止するジェスチャが検出された場合を意味します。ただし、長押しメソッドは値を返さないため、長押しは少し異なります。この場合、長押しがトリガーされたときに設定したブール値がどこかにあるだけで、後で必要に応じてタッチイベント処理メソッドで確認します。

于 2011-01-10T21:45:43.413 に答える
2

できることの 1 つは、SurfaceView に OnLongClickListener を設定することです。

mySurfaceView.setOnLongClickListener(l);

次に、SurfaceView で onTouchEvent をオーバーライドする必要があります。

public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);
    return true;
}
于 2011-02-25T08:11:48.807 に答える