ontouchevent () против ontouch ()

<p>после многих экспериментов с ontouchevent и ontouch я обнаружил, что ontouch работает везде, где вы хотите (будь то в активности или в просмотре), если вы объявили интерфейс и исправили слушателя! с другой стороны, ontouchevent работает только внутри view! правильно ли мое предположение? это реальная разница? </p>

<p>да, вы правы - <code>ontouch()</code> используется<strong> пользователями </strong><code>view</code> для получения событий касания, в то время как <code>ontouchevent()</code> используется<strong> производными классами </strong><code>view</code> для получения событий касания.</p>

<p>у меня была путаница, связанная с тем, как работают ontouchevent () и ontouch () (вы можете увидеть мой комментарий к этому вопросу). после некоторого исследования ниже, это то, что я нашел на нем. это может быть полезно для начинающих.</p><p>1) реализация:</p><p>если вы хотите использовать ontouch (), вы должны сделать три вещи.</p><p>1- внедрить ontouchlistener</p><p>2 - вызовите setontouchlistener () для представления, которое вы хотите установить, перехватите событие</p><p>3 - переопределить ontouch () для обработки события</p><p>но если вы хотите использовать ontouchevent (), вам не нужно делать шаги 1 и 2 выше. просто нужно переопределить ontouchevent ().</p><p>2) работа:</p><p>ontouch () работает с view, viewgroup, активность. это означает, что вы можете использовать ontouch () внутри вида, группы просмотра или деятельности. этот метод принимает два аргумента [ontouch (view v, motionevent e)]. это позволяет фильтровать события для разных представлений в деятельности или группе представлений. или деятельность может сама справиться с этим . <strong> ontouchevent () принимает один аргумент [<code>ontouchevent(motionevent e)</code>]. таким образом, это можно использовать только внутри представления, которое его реализует, или в производном представлении. </strong>производное представление включает расширение поведения касания, определенного в ontouchevent (). </p><p>я думаю, что такие варианты являются частью более гибкой философии разработки android, хотя иногда это создает путаницу для учащихся.</p>

<p>я использовал ontouch () и ontouchevent (), так как ontouch используется, когда я хочу работать с элементами единого представления, такими как кнопки, кнопки изображения и т.д. в одном представлении (скажем, linearlayout), тогда как когда я хочу работать с областями, остальными мои элементы (например, кнопка) я использую ontouchevent. </p>

<p>при создании пользовательского просмотра вы можете </p><p><code>@override ontouchevent(motionevent e){}</code></p><p><strong> тогда как вы можете добавить ontouch к любому view, viewgroup или activity. </strong></p><p><code>ontouch(view v, motionevent e) { //you can filter any view's touch }</code></p><p><strong> ontouch является универсальным, а ontouchevent - определенным для view. </strong>и вы также можете отфильтровать ваш взгляд, используя ontouch.</p>

<p>ontouchevent () фактически<em> будет </em>вызван activity, если ни одно из представлений не использует событие touch. </p><p>и, как вы говорите, ontouch () может использоваться в любом классе, если:</p><ol> <li>этот класс (т.е. foo) реализует интерфейс ontouchlistener и </li> <li>этот класс является зарегистрированным слушателем, использующим <code>view.setontouchlistener(foo);</code></li> </ol>

<p>я нашел другое отличие. ontouchevent, похоже, не получает устаревшие события motionevent.action\_pointer\_2\_down и motionevent.action\_pointer\_2\_up.</p><p>конечно, они довольно старые, и мы не должны их использовать.</p><p>это в android 5.1 api 22.</p>

<p><strong> ontouchevent </strong>- это метод, реализованный с помощью<strong> view </strong>,<strong> activity </strong>и других базовых классов, таких как<strong> linearlayout </strong>,<strong> etc </strong>..</p><pre><code>public boolean ontouchevent(motionevent event) { throw new runtimeexception("stub!"); } </code></pre><p>вы можете переопределить этот метод любыми производными классами</p><p><strong> в то время как </strong></p><p><strong> ontouch () </strong>определяется интерфейсом<strong> ontouchlistener </strong>{}</p><p><code>public interface ontouchlistener { boolean ontouch(view var1, motionevent var2); }</code></p><p>так что вам нужно реализовать только один при установке этого интерфейса для класса</p>