onTouchEvent处理机制

传递流程

(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。

(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递,默认返回false,返回true表示拦截。

(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。view中onTouchEvent默认返回true表示消费了这个事件。

其中Layout里的onInterceptTouchEvent默认返回值是false,这样touch事件会传递到View控件,Layout里的onTouch默认返回值是false, View里的onTouch默认返回值是true,当我们手指点击屏幕时候,先调用ACTION_DOWN事件,当onTouch里返回值是true的时候,onTouch回继续调用ACTION_UP事件,如果onTouch里返回值是false,那么onTouch只会调用ACTION_DOWN而不调用ACTION_UP.

(4) 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。

(5) OnTouchListener优先于onTouchEvent()对事件进行消费。

上面的消费即表示相应函数返回值为true。

一.只有view,ViewGroup,Activity 具有事件分发和消费的功能。

二,Activity因为上最先接触到触摸事件,因此Activity没有事件拦截方法。即没有onInterceptTouchEvent方法。

三.对于不能添加子控件的view,不能对事件进行分发和拦截,它只有onTouchEvent事件。

四.public boolean dispatchTouchEvent(MotionEvent ev) 事件分发:

当触摸事件发生的时候,首先会被当前的activity进行分发,即当前activity的dispatchTouchEvent方法会被执行。这个时候,该方法有三种返回的情况:
return false:
表明事件不会被进行分发。事件会以冒泡的方式被传递给上层的view或activity的onTouchEvent方法进行消费掉。
return true:
表明该时间已经被处理。事件会被当前view或activity的dispatchTouchEvent给消费掉。不会再进行传递,事件到此结束。
return super.dispatchTouchEvent(ev):
表明该事件将会被分发。此时当前View的onIntercepterTouchEvent方法会捕获该事件,判断需不需要进行事件的拦截。

五.public boolean onInterceptTouchEvent(MotionEventev) 事件拦截:
该方法用户拦截被传递过来的事件,用于判断被传递过来的事件是否需要被当前的view进行处理。
return false :不对事件进行拦截,放行该事件。事件会被传递到当前view的子控件中,由子控件中的dispatchTouchEvent方法进行分发处理。
return true :拦截该事件,将该事件交给当前view的onTouchEvent方法进行处理。
return super.inInterceptTouchEvent(ev):
默认拦截方式,和returntrue一样。该事件会被拦截,将该事件交给当前view的onTouchEvent方法进行处理。(这里需要有一点说明,当有两个view。Aview中有一个Bview.点击A.A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),则事件将会被A进行拦截,交给A的onTouchEvent()进行处理,如果点击的是B,A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),则事件将不会被拦截,会被分发到子控件中)

六.public boolean onTouchEvent(MotionEventevent) 事件处理
当前的view把事件进行了拦截,则事件则会被传递到该方法中
return false:
表明没有消费该事件,事件将会以冒泡的方式一直被传递到上层的view或Activity中的onTouchEvent事件处理。如果最上层的view或Activity中的onTouchEvent还是返回false。则该事件将消失。接下来来的一系列事件都将会直接被上层的onTouchEvent方法捕获
return true:
表明消费了该事件,事件到此结束。
return super.onTouchEvent(event):
默认情况,和return false一样。


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java的事件处理是通过事件分发和事件监听器来实现的。事件分发是指将事件传递给相应的处理对象,而事件监听器则是用于接收和处理事件的对象。 在Java中,事件分发的对象通常是指用户界面组件,例如按钮、文本框等。当用户与界面组件进行交互时,会产生相应的事件,例如点击事件、鼠标移动事件等。这些事件的相关细节会被封装成事件对象。 事件分发的本质是将事件传递到某个具体的处理对象,这个过程通常是从顶层容器开始,逐级向下传递,直到找到能够处理该事件的对象为止。在Android中,事件的传递顺序通常是从Activity开始,然后传递给ViewGroup,最后传递给具体的View。 事件分发过程涉及到几个核心方法,包括dispatchTouchEvent、onInterceptTouchEventonTouchEvent。其中,dispatchTouchEvent方法用于分发事件,onInterceptTouchEvent方法用于拦截事件onTouchEvent方法用于处理事件。 在Java中,可以通过设置事件监听器来监听和处理事件。常见的事件监听器包括OnClickListener、OnTouchListener等。通过设置相应的监听器,可以在事件发生时执行相应的操作,例如点击按钮时执行某个方法。 总结起来,Java的事件处理通过事件分发和事件监听器来实现。事件分发将事件传递给相应的处理对象,而事件监听器则用于接收和处理事件。这种机可以实现用户界面的交互和响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值