android方向触摸事件,Android触摸事件如何传递?

733014275751f36ac2f48ae299bc893c.png

慕工程0101907

让我们看一个视觉示例。在此处输入图片说明发生触摸事件时,首先会向每个人通知该事件,从活动开始,一直到顶部的视图。然后,每个人都有机会处理该事件,从顶部的视图(触摸区域中Z顺序最高的视图)开始,一直回到活动。因此,活动是第一个听到它的人,也是最后一个有机会处理它的人。在此处输入图片说明如果某些ViewGroup中要处理的触摸事件马上(而不是给别人下了线它的机会),那么它可以只返回true它onInterceptTouchEvent()。活动没有,onInterceptTouchEvent()但您可以覆盖dispatchTouchEvent()以执行相同的操作。如果View(或ViewGroup)具有OnTouchListener,则touch事件由处理OnTouchListener.onTouch()。否则由来处理onTouchEvent()。如果由于任何触摸事件而onTouchEvent()返回true,则处理在那里停止。线下没有其他人有机会。更详细的解释上图使事情比实际要简单一些。例如,在Activity和ViewGroup A(根布局)之间还有Window和DecorView。我把它们排除在上面是因为我们通常不必与它们进行交互。但是,我将在下面包括它们。下面的描述通过源代码跟踪触摸事件。您可以单击链接查看实际的源代码。(更新:源代码已更新,因此现在行号已关闭,但是单击链接仍将带您到正确的文件。只需搜索方法名称即可。)dispatchTouchEvent()通知活动有触摸事件。touch事件以形式传递MotionEvent,其中包含x,y坐标,时间,事件类型和其他信息。触摸事件发送到窗口的superDispatchTouchEvent()。Window是一个抽象类。实际的实现是PhoneWindow。获取通知的下一行是DecorView的superDispatchTouchEvent()。DecorView是处理状态栏,导航栏,内容区域等的FrameLayout元素。它实际上只是一个子类,它本身是的子类ViewGroup。收到通知的下一个通知(如果我错了,请纠正我)是您的活动的内容视图。在Android Studio的布局编辑器中创建布局时,这就是您在xml中设置为活动的根布局的内容。因此,无论您选择a RelativeLayout,a LinearLayout还是a ConstraintLayout,它们都是的子类ViewGroup。并且ViewGroup在中获得有关touch事件的通知dispatchTouchEvent()。这是我上图中的ViewGroupA。该ViewGroup会通知任何孩子有触摸事件,包括任何ViewGroup儿童。这是我上面的图中的ViewGroupB。沿途的任何地方,一个ViewGroup能短路通过返回通知处理true为onInterceptTouchEvent()。假设没有ViewGroup缩短通知,通知行的自然结尾是dispatchTouchEvent()调用View的get时。现在该开始处理事件了。如果存在OnTouchListener,则它有第一个机会使用来处理触摸事件onTouch()。否则,视图onTouchEvent()就可以处理它。现在,所有递归排列的ViewGroup都有机会以相同的方式处理touch事件View。虽然,我没有表明这上面的图中,一个ViewGroup是View子类,所以一切我已描述OnTouchListener.onTouch()和onTouchEvent()也适用于ViewGroups。最后,如果没有其他人想要它,则Activity也将获得使用来处理事件的最后机会onTouchEvent()。常问问题我什么时候需要覆盖dispatchTouchEvent()?如果要在任何视图获得机会之前捕获触摸事件,请在“活动”中覆盖它。对于ViewGroup(包括根视图),只需覆盖onInterceptTouchEvent()和即可onTouchEvent()。我什么时候需要覆盖onInterceptTouchEvent()?如果您只想监视即将出现的触摸通知,则可以在此处进行操作并返回false。但是,重写此方法的主要目的是让ViewGroup处理某种类型的触摸事件,同时让孩子处理另一种类型的事件。例如,a ScrollView这样做是为了处理滚动,同时让其子项处理诸如Button单击之类的操作。相反,如果子视图不想让其父视图窃取其触摸事件,则可以调用requestDisallowTouchIntercept()。触摸事件类型是什么?主要的是ACTION_DOWN-这是触摸事件的开始。你应该总是返回true的ACTION_DOWN事件onTouchEvent,如果你要处理的触摸事件。否则,您将不会再收到其他事件。ACTION_MOVE -当您在屏幕上移动手指时,会连续触发此事件。ACTION_UP -这是触摸事件的最后一个事件。亚军是ACTION_CANCEL。如果树上的ViewGroup决定拦截触摸事件,则调用此方法。您可以在此处查看其他类型的MotionEvent 。由于Android是多点触控,因此当其他手指(“指针”)触摸屏幕时也会触发事件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值