ПОДХОД 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, и вам не придется оплачивать вышеупомянутые расходы, но по большей части они в любом случае не такие дорогие.