Где мне реализовать Android на TouchListener? - PullRequest
3 голосов
/ 29 февраля 2012

Я новичок в разработке для Android, и на данный момент я должен принять решение о том, где управлять жестовым вводом, но я просто не знаю плюсы и минусы того, где захватить сенсорный ввод.Мне дали две альтернативы, не могли бы вы объяснить мне плюсы и минусы в любом случае?

Установить слушателя на View;реализовать методы:

faceView.setOnTouchListener(new OnTouchListener(){
   public boolean onTouch(View arg0, MotionEvent arg1){
     return false;
   }
);

или

Метод переопределения в View

public boolean onTouchEvent(MotionEvent event){
   return false;
}

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

ПОДХОД 1: Анонимный внутренний тип.

faceView.setOnTouchListener(new OnTouchListener(){
   public boolean onTouch(View arg0, MotionEvent arg1){
     return false;
   } 
);

Это аноним, потому что это объявление без имени. Нет OnTouchListener mytouch =, есть только объявление new OnTouchListener(). Это внутреннее, потому что это внутри другого класса, и это тип, потому что это реализация интерфейса.

ОК, так что с учетом этого. Такой подход более удобен для разработчиков. Функциональность изолирована (как правило, объявлением прослушиваемого), и этим легко управлять. Но это удобство имеет свою цену. Предположим, у вас есть кнопки с десятью onClickListeners. При таком подходе очередь сбора мусора будет заполняться быстрее с каждым новым анонимным внутренним типом.

Но имеет ли это значение? На самом деле, нет. Если вы пытаетесь использовать каждую микросекунду производительности своей системы, то не используйте этот подход. Но, как правило, это жизнеспособно.

ПОДХОД 2: одиночное наследование

public boolean onTouchEvent(MotionEvent event){
   return false;
} 

Предполагая, что вы прочитали выше, этот подход имеет гораздо меньшую стоимость для создания и очистки. Существует только 1 дополнительный экземпляр класса и только 1 объект, добавленный в очередь GC.

Это подход, который я использую, и использовал некоторое время. Это также то, что я вижу в примере исходного кода Google.

Но это не идеально! Реализация onTouchEvent будет выглядеть так:

public void onTouch(Event e){
if (e.equals(View1)){
}else if (e.equals(View2)){
}else if (e.equals(View 3)){
...}

SO

Честно говоря, это не имеет значения. Если вы хотите максимально возможную производительность, используйте статический прослушиватель onTouchEvent, и вам не придется оплачивать вышеупомянутые расходы, но по большей части они в любом случае не такие дорогие.

0 голосов
/ 29 февраля 2012

В большинстве случаев вы, вероятно, будете использовать setOnTouchListener, поскольку он обеспечивает большую гибкость и следует общему шаблону Java. Как правило, переопределение onTouchEvent будет использоваться только для каскадных событий, которые всегда будут происходить в представлении, и каскадных событий, которые не изменятся. Вам также необходимо определить класс View для переопределения onTouchEvent. При использовании чего-то вроде кнопки не имеет смысла реализовывать собственный класс кнопок только для обработки события нажатия!

faceView.setOnTouchListener

Pro

  • Позволяет легко настроить
  • Следует общепринятому шаблону Java

Против

  • Может привести к ненужным установщикам, если поведение не изменится.

Переопределить onTouchEvent Pro

  • Инкапсулирует функциональность в базовом классе

Минусы

  • Не позволяет настраивать
0 голосов
/ 29 февраля 2012

Я бы лично использовал слушателя, просто используйте это в вашем методе onCreate, сейчас все будет в порядке

...