Intereting Posts
LinearLayout: layout_gravity = "bottom" не работает на горизонтальном LinearLayout Что конкретно делает аннотация Android @hide? Это означает, что minifyEnabled false в блоке release в файле gradle.build Разница между OpenCV и OpenCL Как программно просматривать другую языковую клавиатуру в приложении Android? «Идентификатор ресурса не найден для атрибута« showAsAction »в пакете« Android ». Почему этот сценарий оболочки называется скриптом python? QuickActions, как приложение Twitter Как исправить «Избегайте передачи null в качестве корня представления» в android? Отладка кода Android NDK C / C ++ в Eclipse – точки останова не попадают Просмотр фрагмента ViewPager's, потерянный при отображении родительского фрагмента ViewPager, затем отображается Как обслуживать файл на SD-карте с помощью NanoHTTPD (внутри Android) Как сделать телефонный звонок с динамиком на Где я могу увидеть стиль styles.xml по умолчанию в Android? Android: adb: разрешение отклонено

OnTouchevent () vs onTouch ()

После многих экспериментов с onTouchEvent и onTouch я обнаружил, что onTouch работает везде, где вы хотите (будь то в действии или просмотре), пока вы объявили интерфейс и правильно поставили Listener! С другой стороны, onTouchEvent работает только внутри представления! Правильно ли мое предположение? Это реальная разница?

Solutions Collecting From Web of "OnTouchevent () vs onTouch ()"

Да, вы правы – onTouch() используется пользователями View для получения событий касания, а onTouchEvent() используется производными классами View для получения событий касания.

У меня была некоторая путаница, связанная с тем, как работают onTouchEvent () и onTouch () (вы можете увидеть мой комментарий к этому вопросу). После некоторых исследований, приведенных ниже, я нашел на этом. Это может быть полезно для новичков.

1) Реализация:

Если вы хотите использовать onTouch (), вам нужно сделать три вещи.

1- реализовать OnTouchListener

2- вызов setOnTouchListener () в представлении, которое вы хотите установить, чтобы уловить событие

3-override onTouch () для обработки события

Но если вы хотите использовать onTouchEvent (), вам не нужно делать шаги 1 и 2 выше. Просто вам нужно переопределить onTouchEvent ().

2) Работа:

OnTouch () работает на view, viewgroup, activity. Это означает, что вы можете использовать onTouch () внутри вида, viewgroup или активность. Эти методы принимают два аргумента [onTouch (View v, MotionEvent e)]. Это позволяет фильтровать события для разных представлений в группе действий или просмотра. Или сама деятельность может справиться с этим. OnTouchEvent () принимает один аргумент [ onTouchEvent(MotionEvent e) ]. Таким образом, это можно использовать только внутри представления, которое реализует его или на производном виде. Выведенный вид позволяет расширить поведение касания, определенное в onTouchEvent ().

Я думаю, что такие опции являются частью более гибкой философии развития Android, хотя иногда это создает путаницу для учеников.

Я использовал ontouch () и ontouchevent (), поскольку ontouch используется, когда я хочу работать с элементами единого вида, например кнопками, кнопками изображения и т. Д. На одном представлении (скажем, Linringayout), тогда как когда я хочу работать над областями, остальными Мои элементы (например, кнопка) я использую ontouchevent.

Фактически функция onTouchEvent () будет вызвана Activity, если ни один из просмотров не примет событие touch.

И, как вы говорите, onTouch () может использоваться в любом классе, если:

  1. Этот класс (т.е. Foo) реализует интерфейс OnTouchListener и
  2. Этот класс является зарегистрированным слушателем, используя view.setOnTouchListener(foo);

При создании пользовательского представления вы можете

@override onTouchEvent(MotionEvent e){}

Тогда как вы можете добавить onTouch в любой View, ViewGroup или Activity.

onTouch(View v, MotionEvent e) { //you can filter any View's touch }

OnTouch является общим, а onTouchEvent – для просмотра. И вы также можете отфильтровать свое представление, используя onTouch.

Я нашел другую разницу. OnTouchEvent, похоже, не получает устаревшие события MotionEvent.ACTION_POINTER_2_DOWN и MotionEvent.ACTION_POINTER_2_UP.

Конечно, они довольно старые, и мы не должны их использовать.

Это в Android 5.1 api 22.

OnTouchEvent – это метод, реализованный в представлении , действии и других базовых классах, таких как LinearLayout и т . Д.

 public boolean onTouchEvent(MotionEvent event) { throw new RuntimeException("Stub!"); } 

Вы можете переопределить этот метод любыми производными классами

в то время как

OnTouch () определяется интерфейсом OnTouchListener {}

public interface OnTouchListener { boolean onTouch(View var1, MotionEvent var2); }

Поэтому вам нужно только реализовать его при настройке этого интерфейса на класс