После многих экспериментов с onTouchEvent и onTouch я обнаружил, что onTouch работает везде, где бы вы ни хотели (будь то в действии или в представлении), пока вы объявили интерфейс и правильно поставили Listener! С другой стороны, onTouchEvent работает только внутри представления! Правильно ли мое предположение? Это реальная разница?
OnTouchevent() vs onTouch()
Ответ 1
Да, вы правы - onTouch()
используется пользователями View
для получения событий касания, а onTouchEvent()
используется производными классами View
, чтобы получить события касания.
Ответ 2
У меня была некоторая путаница, связанная с тем, как работают onTouchEvent() и onTouch() (вы можете увидеть мой комментарий к этому вопросу). После некоторых исследований ниже я узнал об этом. Это может быть полезно для новичков.
1) Реализация:
Если вы хотите использовать onTouch(), вам нужно сделать три вещи.
1- реализовать OnTouchListener
2- вызов setOnTouchListener() в представлении, которое вы хотите установить, чтобы уловить событие
3- переопределить onTouch() для обработки события
но если вы хотите использовать onTouchEvent(), вам не нужно делать шаги 1 и 2 выше. просто вам нужно переопределить onTouchEvent().
2) Работа:
onTouch() работает в режиме просмотра, просмотра, активности. Это означает, что вы можете использовать onTouch() внутри вида, viewgroup или активность. Эти методы принимают два аргумента [onTouch (View v, MotionEvent e)]. Это позволяет фильтровать события для разных представлений в группе действий или просмотра. Или сама деятельность может справиться с этим. onTouchEvent() принимает один аргумент [onTouchEvent(MotionEvent e)
]. Таким образом, это можно использовать только внутри представления, которое реализует его или на производном виде. Производный вид позволяет расширять поведение касания, определенное в onTouchEvent().
Я думаю, что такие опции являются частью более гибкой философии развития Android, хотя иногда это создает путаницу для учеников.
Ответ 3
Я использовал ontouch() и ontouchevent(), поскольку ontouch используется, когда я хочу работать с элементами единого вида, например кнопками, кнопками изображения и т.д. на одном изображении (скажем, Linringayout), тогда как когда я хочу работать над областями остальные элементы (например, кнопка) я использую ontouchevent.
Ответ 4
Фактически, onTouchEvent() будет вызван действием, если ни один из просмотров не примет событие касания.
И, как вы говорите, onTouch() может использоваться в любом классе, если:
- Этот класс (т.е. Foo) реализует интерфейс OnTouchListener и
- Этот класс является зарегистрированным слушателем, используя
view.setOnTouchListener(foo);
Ответ 5
При создании пользовательского представления вы можете
@override
onTouchEvent(MotionEvent e){}
, тогда как вы можете добавить onTouch в любой View, ViewGroup или Activity.
onTouch(View v, MotionEvent e)
{
//you can filter any View touch
}
onTouch является общим, а onTouchEvent - для просмотра. И вы также можете отфильтровать свое представление с помощью onTouch.
Ответ 6
Я нашел другое различие. onTouchEvent, похоже, не получает устаревшие события MotionEvent.ACTION_POINTER_2_DOWN и MotionEvent.ACTION_POINTER_2_UP.
Конечно, они довольно старые, и мы не должны их использовать.
Это в Android 5.1 api 22.
Ответ 7
onTouchEvent - это метод, реализованный View, Activity и другими базовыми классами, такими как LinearLayout, и т.д...
public boolean onTouchEvent(MotionEvent event) {
throw new RuntimeException("Stub!");
}
вы можете переопределить этот метод любыми производными классами
тогда
onTouch() определяется интерфейсом OnTouchListener {}
public interface OnTouchListener {
boolean onTouch(View var1, MotionEvent var2);
}
поэтому вам нужно только реализовать его при установке этого интерфейса в класс