Android:Touch事件拦截机制

道长说了这么多自定义View,还没说自定义View会遇到什么问题,其实这个问题不止在自定义View中存在。在开发中遇到控件嵌套,堆叠都会出现,比如:点击子控件,子控件接收不到点击事件等等。这里道长简单说一下Android的事件拦截机制。重点是记录一下道长的想法。这里有大牛写的更详细更深入,想看的话可以点击传送门:android事件拦截处理机制详解

  • View布局
    这里写图片描述

  • 控件方法
    手机当前界面为Activity,在当前界面中有ViewGrouopA控件及其子控件ViewGroupB,ViewGroupB的子控件View。
    在ViewGroupA/ViewGroupB中都有方法dispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent()方法,在Activity/view中只有dispatchTouchEvent()与onTouchEvent()方法。

    dispatchTouchEvent(MotionEvent ev)  -  用于Touch事件的分发
    onInterceptTouchEvent(MotionEvent ev)  -  用于拦截Touch事件
    onTouchEvent(MotionEvent event)  -  用于处理Touch事件
    


  • 事件传递
    1.当手机界面有触摸事件MotionEvent发生down动作时
    分发判断:会先把事件传递给Activity,先调用dispatchTouchEvent()方法将事件传递给子控件ViewGroupA。
    2.ViewGroupA接收到事件
    分发判断:先调用dispatchTouchEvent()方法,再调用onInterceptTouchEvent()方法判断是否拦截事件。如果onInterceptTouchEvent()方法返回的是true;就调用onTouchEvent()方法消费掉该事件。如果onInterceptTouchEvent()方法返回的是false,就将事件传递给子控件ViewGroup。
    3.ViewGroupB接收到事件
    分发判断:先调用dispatchTouchEvent()方法,再调用oninterceptTouchEvent()方法判断是否拦截事件。如果onInterceptTouchEvent()方法返回的是true;就调用onTouchEvent()方法消费掉该事件。如果onInterceptTouchEvent()方法返回的是false,就将事件传递给子控件View。
    4.View接收到事件
    分发判断:先调用dispatchTouchEvent()方法,然后直接调用onTouchEvent()方法处理事件。如果onTouchEvent()方法返回的是true,表示消费了事件;如果返回的是false,表示不需要这个事件,对这个事件不进行任何处理。将这个事件返回到调用处View控件的dispatchTouchEvent()方法,再由dispatchTouchEvent()方法把事件返回到父控件ViewGroupB。
    5.ViewGroupB直接调用onTouchEvent()方法处理事件
    返回判断:如果onTouchEvent()方法返回的是true,表示消费了事件;如果返回的是false,表示不需要这个事件,对这个事件不进行任何处理。将这个事件由dispatchTouchEvent()方法把事件返回到父控件ViewGroupA。
    6.ViewGroupA直接调用onTouchEvent()方法处理事件
    返回判断:如果onTouchEvent()方法返回的是true,表示消费了事件;如果返回的是false,表示不需要这个事件,对这个事件不进行任何处理。将这个事件由dispatchTouchEvent()方法把事件返回到Activity。
    7.Activity直接调用onTouchEvent()方法处理事件
    返回判断:如果onTouchEvent()方法返回的是true,表示消费了事件;如果返回的是false,表示不需要这个事件,对这个事件不进行任何处理,事件丢失。

  • 示意图
    这里写图片描述

关于Android事件拦截机制道长就先记录到这里,以后有了新的想法在记录。希望这篇博客能够为你提供一些帮助。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: -webkit-overflow-scrolling: touch; 是一个CSS属性,用于在移动设备上实现平滑的滚动效果。它可以应用于具有滚动内容的元素,例如 div 或 iframe。当用户在移动设备上滚动该元素时,它将以流畅的方式滚动,而不是像默认滚动一样卡顿。 ### 回答2: -webkit-overflow-scrolling:touch;是一个CSS属性,用于移动设备的浏览器中控制页面滚动的行为。当一个页面在移动设备上被访问时,其内容有可能会超过设备屏幕的大小,此时就需要滚动来查看页面内容。但是,在移动设备上的滚动效果相较于在桌面电脑上的体验要差很多,因为它们通常会有卡顿、慢反应或跳跃等不良效果。这样的效果会影响用户的体验,因此必须要采用一些方法来改善这种情况。 -webkit-overflow-scrolling:touch;可以帮助我们实现流畅的滚动效果,消除卡顿、慢反应和跳跃等问题。这个属性是仅适用于 Webkit 内核的,因此在移动设备上使用较为广泛。它会在页面滚动时使用硬件加速来优化滚动性能,从而实现更加平滑、自然的滚动。 这个属性使用起来非常简单,只需要将它添加到滚动区域的 CSS 样式中即可。例如: #scrollable { height: 150px; -webkit-overflow-scrolling: touch; overflow-y: auto; } 在这个例子中,页面中的一个元素被定义为滚动区域。当使用触摸设备滚动时,-webkit-overflow-scrolling:touch;会生效,从而确保滚动平滑自然。 总之,-webkit-overflow-scrolling:touch;是一个非常有用的属性,它可以提高移动设备上页面滚动的性能和用户体验。无论是开发移动网站还是移动应用,我们都应该考虑使用这个属性来改善用户体验。 ### 回答3: -webkit-overflow-scrolling: touch;是一个CSS属性,用于在屏幕上启用流畅的滚动功能。它主要应用于移动设备上的网页浏览器。通过启用此属性,用户可以在触摸屏上轻松地使用手指来滚动页面,而不会出现卡顿或延迟的情况。 该属性只能在Webkit浏览器中使用,以确保兼容性。它适用于大多数常见的移动设备和平板电脑,包括iPhone, iPad, Android手机和平板电脑等。 此属性的主要目的是优化网页在移动设备上的用户体验。由于移动设备的屏幕尺寸通常较小,因此需要在较小的屏幕上显示更多的内容。通过使用此属性,用户可以轻松地滚动网页并捕捉所需要的内容,而无需缩放视图或调整字号。 此外,-webkit-overflow-scrolling: touch;还可用于增强应用程序的用户体验。例如,在移动应用程序中,可以使用此属性使用户可以轻松地滚动列表或其他元素。 总之,-webkit-overflow-scrolling: touch;是一种对网页和应用程序的特殊效果,可以在移动设备上改善用户体验。它通过启用流畅的滚动功能,让用户可以轻松地浏览内容,缩小了移动设备和桌面网页之间的差距。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值