0

マインドストームロボットをリモートコントロールするために使用するクラスにonTouchを実装しようとしています。まだやるべきことがたくさんありますが、今のところ、onClickを使用するダイレクトコントロールを整理しようとしています。5つのボタン、以下のコードのような5つのインスタンス化。これは、ロボットが移動するための命令を含む5つのメソッドの1つを呼び出します。

編集:アクティビティには5つのボタンがあり、それぞれが何かを行います。元のクラスは、以下に示すようにonClickListenerを使用しました。ここでは、実行する実際のコードを持つvoidメソッドを呼び出すOnCreateメソッド内でインスタンス化されます。

リモートをより良くするため、代わりにonTouchを使用したかったのです。しかし、複数のボタンで機能させるのに問題がありました。

btn1 = (Button) findViewById(R.id.btn1);// instantiates a button called
    // btn1 one from the xml
    btn1.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            driveFore();//move forward

        }// calls the method
    });// end of method

これは元のonClickであり、onCreateの外部のメソッドを呼び出します。

private void driveFore() {
    // TODO Auto-generated method stub

    Motor.A.forward();
    Motor.B.forward();

}//Move forward

上記を実行したいのですが、onTouchを使用します。そのままボタンをクリックすると、別のボタンがクリックされるまでモーターが動き続けるので、ボタンを押している間だけ動くので、onTouchの方がいいと思いました。

そしてこれはonTouchの変種です

btn1 = (Button) findViewById(R.id.btn1);
    btn1.setOnTouchListener(this);

どちらがリッスンします

 public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    switch (event.getAction()) {
     case MotionEvent.ACTION_DOWN:
            Motor.A.forward();
            Motor.B.forward();
            break;
     case MotionEvent.ACTION_UP:{

            Motor.A.flt();
            Motor.B.flt();
    }
    break;
}
    return true;
}

上記のコードは機能しますが、ボタンが1つだけです。上記を5つものボタンに適用するにはどうすればよいでしょうか。

編集:提案されたように、私はこれらの2つの方法を使用してみました:

            btn1 = (Button) findViewById(R.id.btn1);
        btn1.setOnTouchListener(new OnTouchListener(){
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Motor.A.forward();
                Motor.B.forward();
                break;
             case MotionEvent.ACTION_UP:
                Motor.A.flt();
                Motor.B.flt();
             }
            return true;

        }
    });


    btn2 = (Button) findViewById(R.id.btn2);
    btn2.setOnTouchListener(new OnTouchListener(){
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Motor.A.forward();
                Motor.B.forward();
                break;
             case MotionEvent.ACTION_UP:
                Motor.A.flt();
                Motor.B.flt();
             }
            return true;
        }
    });

正常に動作します。みんなありがとう。

4

1 に答える 1

1

Activity で OnTouchListener を拡張する必要はありません。匿名の内部クラスでも同じことができます。このような:

btn1.setOnTouchListener(new OnTouchListener(){
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Motor.A.forward();
            Motor.B.forward();
            break;
         case MotionEvent.ACTION_UP:
            Motor.A.flt();
            Motor.B.flt();
         }
    }
});

btn2.setOnTouchListener(new OnTouchListener(){
    public boolean onTouch(View v, MotionEvent event) {
        // Something else here
    }
});
于 2012-03-26T20:52:56.277 に答える