1

カスタムAndroidUIを作成しましたが、このコントロールを処理するにはUIビューが必要です。

a)マウスボタンが押されている間(onDown / Keyが押されている)、ビューは何かを実行し続ける必要があります(例:Key is down)

b)マウスキーを離すとすぐに、ビューに「キーが上がっています」と表示されます。

サンプルフローは、ビューを押したときのようなものになります。

出力:(ビュー上でマウスボタンを押したままにします

キーがダウンしています

キーがダウンしています

キーがダウンしています

キーがダウンしています

キーがダウンしています

キーがダウンしています

マウスボタンを離します

キーが上がっています。

私の問題をもっと説明するために。ロジックを配置するコードスニペットを投稿しています

@Override

public boolean onTouchEvent(MotionEvent event) {
    Log.d(TAG, event.getAction());
}

マウスボタンを押すと「0」(マウスが下がっていることを意味します)が出力され、そのままにしておくとログ「1」(マウスが上になっていることを意味します)に出力されます。それはロジックに役立つはずです。

助けてくれてありがとう。


さて私は次のようなものを試しました

private static int checkValue = 0;

@Override

public boolean onTouchEvent(MotionEvent event) {

    checkValue = event.getAction();

    while (checkValue == 0 ){

    Log.d(TAG, "Pressed");
    checkValue = checkMethod(event.getAction);


}

    private int checkMethod(int test){

    if (checkValue == 0){

      checkValue = 0;
      }

    else checkValue = 1;
}
4

4 に答える 4

1

タッチが発生したときに、volatile boolean stop = falseフィールドがあり、しばらくスリープした後、すべてのループでこの値をチェックするスレッドを作成して開始できる可能性があります。タッチが終了したら、ブール変数をfalseに設定できます。

編集:例を追加

private MyHandler h;

public void handleDown() {
  System.out.println("touch began");
  h = new MyHandler();
  h.start();
}

public void handleUp() {
  h.pleaseStop = true;
  System.out.println("touch ended");
}

class MyHandler extends Thread {
  volatile boolean pleaseStop = false;

  public void run() {
    while (!pleaseStop) {
      System.out.println("touch is active...");
      Thread.sleep(500);
    }
  }
}
于 2010-12-03T17:18:01.840 に答える
1

OnTouchEventListener を定義するだけです...

private OnTouchListener onTouchListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v.getId() == R.id.button) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                //start loop or background task
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                //do something different
            }
        } 
        return true;
    }
} 

...そしてそれをボタンに割り当てます。

button.setOnTouchListener(onTouchListener);

ユーザーがボタンに触れると、ACTION_DOWN イベントが発生します。ユーザーがボタンを離すと、ACTION_UP イベントが発生します。必要に応じて、ブール変数をチェックできるスレッドでループを開始できます。正しいかどうかは確認していませんが、次のようになります。

private OnTouchListener onTouchListener = new OnTouchListener() {

        private boolean flag = false;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (v.getId() == R.id.button) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    flag = true;
                    Thread thread = new Thread(new Runnable() {

                        @Override
                        public void run() {
                            while(flag) {
                                //do something
                            }
                        }
                    });
                    thread.start();
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    flag = false;
                }
            } 
            return true;
        }
    }
于 2010-12-03T17:47:15.207 に答える
1
checkValue = event.getAction();
while (checkValue == 0 ){

魔法の整数を決して使用してはなりません。API で定義されている定数を使用します。

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_DOWN

実際、コードは移動イベントを考慮していません。それがダウンイベントでない場合はアップであると想定しているようです...これは完全に間違っています。

ドキュメントを見て、期待できるアクション値を確認し、関心のある特定のアクションに対して正しいことを行います。たとえば、次のようにします。

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_UP

于 2010-12-03T18:01:09.537 に答える
0

タッチによって開始されるスレッドを作成し、それを維持するためのブール値フラグを設定します。タッチが離されたら、フラグを false に設定して、スレッドが参加 (終了) するようにします。

スレッドはメイン ロジックから独立しているため、処理が高速になります。

于 2010-12-10T03:14:31.007 に答える