2012-03-26 4 views
0

Я пытаюсь реализовать onTouch в своем классе, используемом для дистанционного управления роботом-умом. Мне еще предстоит сделать много работы, но пока я пытаюсь убрать прямой контроль, который использует onClick. 5 кнопок, 5 экземпляров, таких как код ниже, который вызывает один из 5 методов, содержащих инструкции для перемещения робота.OnTouch в стиле OnClick

EDIT: Активность имеет 5 кнопок, каждая делает что-то. Исходный класс используется onClickListener, как показано ниже, где они будут инстанцироваться в методе OnCreate, вызывая метод void, который имел бы действительный код для выполнения.

Я хотел использовать 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 кнопок.

EDIT: Как предложил я попытался использовать эти два метода:

  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; 
     } 
    }); 

работает просто отлично. Спасибо, парни.

+0

Что значит, что он работает только на 1 кнопку? Вы пытались настроить слушателей более чем на один? – keyser

+0

Слушатель onTouch установлен для btn1. У меня возникла проблема поместить общедоступный логический метод ontouch в метод, который можно вызвать, как это было бы с onClick – TroothHertz

+0

. Я все еще не полностью понимаю проблему, sry. – keyser

ответ

1

Вам не нужно, чтобы ваша деятельность расширила 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 
    } 
}); 
+0

+ заявление о возврате? – TroothHertz

+0

Справа, извините. Возврат - это логическое значение, указывающее, было ли обработано событие касания здесь или нет. Если вы вернете значение false, оно попытается вымыть прикосновение даже до элемента следующего уровня. – CaseyB

Смежные вопросы