onTouchEvent

《android的事件分发机制》

匆匆过客 提交于 2019-12-09 12:47:43
先看代码 View inflate = LayoutInflater.from(this).inflate(R.layout.xxx, null); EditText viewById = (EditText) inflate.findViewById(R.id.edit_content); viewById.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { //这句话说的意思告诉父View我自己的事件我自己处理 v.getParent().requestDisallowInterceptTouchEvent(true); return false; } }); 其实就是很简单的v.getParent().requestDisallowInterceptTouchEvent(true)这一句就解决了所以问题。 Android 中与 Touch 事件相关的方法包括 1、dispatchTouchEvent(MotionEvent ev) 2、onInterceptTouchEvent(MotionEvent ev) 3、onTouchEvent(MotionEvent ev) 接下来就根据这3个

Android onInterceptTouchEvent 和 onTouchEvent

风流意气都作罢 提交于 2019-12-07 17:24:57
o nInterceptTouchEvent 方法是ViewGroup的方法,也就是所有的容器都将继承该方法。此方法设计的意图是为了在父容器将touch事件传递给子控件的时候可以统一控制。比如button就没有该方法,很明显,button不可能拥有子控件。 onTouchEvent 方法是 view 的方法,当该控件接收到 touch 事件时,此方法会被执行。每一个 touch 事件总是从 ACTION_DOWN 事件开始, ACTION_UP 结束。 Touchevent 中,返回值是 true ,则说明消耗掉了这个事件,返回值是 false ,则没有消耗掉,会继续传递下去 Touch 事件几大原则: 1. 如果在某个层级没有处理 ACTION_DOWN 事件,那么该层就再也收不到后续的 Touch 事件了直到下一次 ACTION_DOWN 事件。 说明: a. 某个层级没有处理某个事件指的是它以及它的子 View 都没有处理该事件。 b. 这条规则不适用于 Activity 层(它是顶层),它们可以收到每一个 Touch 事件。 c. 如果没有处理 ACTION_MOVE 这类事件,不会有任何影响。 2. 如果 ACTION_DOWN 事件发生在某个 View 的范围之内,则后续的 ACTION_MOVE , ACTION_UP 和 ACTION_CANCEL

自定义ViewGroup (3) 与子View之间 Touch Event的拦截与处理

情到浓时终转凉″ 提交于 2019-12-07 04:07:04
在昨天的博客( 自定义ViewGroup(2) )中,我们解决了多个手指交替滑动带来的页面的跳动问题。但同时也还遗留了两个问题。 我们自定义的这个ViewGroup本身还不支持onClick, onLongClick事件。 当我们给子View设置click事件后,我们的ViewGroup居然不能滑动了。 相对来讲,第一个问题稍稍容易处理一点,这里我们先说一下第二个问题。 onInterceptTouchEvent()的作用以及何时会被调用 onInterceptTouchEvent()是用来给ViewGroup自己一个拦截事件的机会,当ViewGroup意识到某个Touch事件应该由自己处理,那么就可以通过此方法来阻止事件被分发到子View中。 为什么onInterceptTouchEvent()方法只接收到来ACTION_DOWN事件??需要处理ACTION_MOVE,ACTION_UP等等事件吗?? 按照google官方文档的说明: 如果onInterceptTouchEvent方法返回true,那么它将不会收到后续事件,事件将会直接传递给目标的onTouchEvent方法(其实会先传给目标的onTouch方法) 如果onInterceptTouchEvent方法返回false,那么所有的后续事件都会先传给onInterceptTouchEvent