全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

android onTouchEvent处理机制总结(必看)

项目中总会用到一些触摸事件,每次使用都是百度各种资料,看各种大神的分析笔记。这次我自己总结下关于触摸事件的一些知识点。一来可以让自己对触摸事件印象更加深刻,也给以后的项目做一个参考。最难理解的其实是onTouchEvent方法。

一、 概述

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

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

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

二、三个方法

1.public boolean dispatchTouchEvent(MotionEvent ev)

当触摸事件发生的时候,首先会被当前的activity进行分发,即当前activity的dispatchTouchEvent方法会被执行。

这个时候,该方法有三种返回的情况:

return false: 表明事件不会被进行分发。事件会以冒泡的方式被传递给上层的view或activity的onTouchEvent方法进行消费掉。

return true:表明该时间已经被处理。事件会被当前view或activity的dispatchTouchEvent给消费掉。不会再进行传递,事件到此结束。

return super.dispatchTouchEvent(ev):表明该事件将会被分发。此时当前View的onIntercepterTouchEvent方法会捕获该事件,判断需不需要进行事件的拦截。

2.public boolean onInterceptTouchEvent(MotionEvent ev)    

该方法用户拦截被传递过来的事件,用于判断被传递过来的事件是否需要被当前的view进行处理。

return false :不对事件进行拦截,放行该事件。事件会被传递到当前view的子控件中,由子控件中的dispatchTouchEvent方法进行分发处理。

return true : 拦截该事件,将该事件交给当前view的onTouchEvent方法进行处理。

return super.inInterceptTouchEvent(ev):默认拦截方式,和return true一样。该事件会被拦截,将该事件交给当前view的onTouchEvent方法进行处理。(这里需要有一点说明,当有两个view。A view中有一个B view.点击A.A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),则事件将会被A进行拦截,交给A的onTouchEvent()进行处理,如果点击的是B,A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),则事件将不会被拦截,会被分发到子控件中) 

3.public boolean onTouchEvent(MotionEvent event)

当前的view把事件进行了拦截,则事件则会被传递到该方法中

return false:表明没有消费该事件,事件将会以冒泡的方式一直被传递到上层的view或Activity中的onTouchEvent事件处理。如果最上层的view或Activity中的onTouchEvent还是返回false。则该事件将消失。接下来来的一系列事件都将会直接被上层的onTouchEvent方法捕获

return true: 表明消费了该事件,事件到此结束。

return super.onTouchEvent(event):默认情况,和return false一样。

验证:

MainActivity FatherView ChildView中几个方法都返回super.****TouchEvent(ev)

分析:

1、当点击屏幕。MainActivity 中的dispatchTouchEvent方法先执行,打印MainActivity-dispatchTouchEvent-->ACTION_DOWN

2、因为返回的是super.dispatchTouchEvent(ev),所以事件ev将会被分发,但是MainActivity中没有onInterceptTouchEvent()方法,所以事件被传递到FatherView中的dispatchTouchEvent方法.打印FatherView-dispatchTouchEvent-->ACTION_DOWN

3、在FatherView中dispatchTouchEvent返回的是super.dispatchTouchEvent(ev),所有事件会被分发。FatherView中的onInterceptTouchEven()中的方法被执行。打印FatherView-onInterceptTouchEven-->ACTION_DOWN

4、FatherView中的onInterceptTouchEven()返回的是super.onInterceptTouchEvent(ev)。在这里,(1)如果点击的是屏幕中的ChildView。事件将不会被拦截,会被传递到ChildView中的dispatchTouchEvent方法中。(2)如果点击的值FatherView则事件将会被拦截。FatherView中的onTouchEvent()方法将被执行。以(1)为例,将打印ChildView-dispatchTouchEvent-->ACTION_DOWN。

5、ChildView中dispatchTouchEvent返回的是super.dispatchTouchEvent(ev),所有事件会被分发。打印ChildView-onInterceptTouchEvent-->ACTION_DOWN。

6、此时ChildView中onInterceptTouchEvent返回的是super.onInterceptTouchEvent(ev),,而且已经没有子控件了,所以事件将被拦截。打印ChildView-onTouchEvent-->ACTION_DOWN。

7、在childView中onTouchEvent()返回额是super.onTouchEvent(ev)。事件将不会被消耗,将以冒泡的方式传递到上层空间中的onTouchEvent(),此处上层空间中的onTouchEvent返回的都是super.onTouchEvent(ev)。所以讲一次打印 Father-onTouchEvent-->ACTION_DOWN。 MainActivty-onTouchEvent-->ACTION_DOWN。

8、之后的事件动作,将不再被MainActivity分发到子view,直接被MainActivty中的onTouchEvent处理消耗。打印MainActivity-dispatchTouchEvent-->ACTION_UP,MainActivty-onTouchEvent-->ACTION_UP

MainActivity-dispatchTouchEvent-->ACTION_DOWN
FatherView-dispatchTouchEvent-->ACTION_DOWN
FatherView-onInterceptTouchEven-->ACTION_DOWN
ChildView-dispatchTouchEvent-->ACTION_DOWN
ChildView-onInterceptTouchEvent-->ACTION_DOWN。
ChildView-onTouchEvent-->ACTION_DOWN
Father-onTouchEvent-->ACTION_DOWN。 
MainActivty-onTouchEvent-->ACTION_DOWN
MainActivity-dispatchTouchEvent-->ACTION_UP,
MainActivty-onTouchEvent-->ACTION_UP

代码

MainActivity.java

public class MainActivity extends Activity {
 
  private static final String TAG = "MainActivity";
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
   super.onCreate( savedInstanceState);
   setContentView(R.layout. activity_main);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event) {
   // TODO Auto-generated method stub
   Log. i(TAG, "activity-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));
   return super.onTouchEvent( event);
  }
 
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
   Log. i(TAG, "activity-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.dispatchTouchEvent( ev);
  }
FatherView.java
public class FatherView extends LinearLayout {
  private static final String TAG = "MainActivity";
 
  public FatherView(Context context) {
   super( context);
 
  }
 
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Father-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.dispatchTouchEvent( ev);
  }
 
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Father-onInterceptTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.onInterceptTouchEvent( ev);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event ) {
   Log. i(TAG, "Father-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));
   return super.onTouchEvent( event);
  }
 
}
ChildView.java
public class ChildView extends LinearLayout {
 
  private static final String TAG = "MainActivity";
 
  public ChildView(Context context) {
   super( context);
  }
 
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Child-dispatchTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.dispatchTouchEvent( ev);
  }
 
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
   Log. i(TAG, "Child-onInterceptTouchEvent-->" + TouchEventUtil.getTouchAction(ev.getAction()));
   return super.onInterceptTouchEvent( ev);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event ) {
   Log. i(TAG, "Child-onTouchEvent-->" + TouchEventUtil.getTouchAction(event.getAction()));
   return super.onTouchEvent( event);
  }
 
}
 

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width= "match_parent"
 android:layout_height= "match_parent"
 tools:context="${relativePackage}.${activityClass}" >
 
 <com.ethanlbb.toucheventtest.FatherView
  android:layout_width= "match_parent"
  android:layout_height= "match_parent"
  android:background= "@android:color/holo_blue_dark"
  android:gravity= "center" >
 
  <com.ethanlbb.toucheventtest.ChildView
   android:layout_width= "200dp"
   android:layout_height= "200dp"
   android:layout_gravity= "center"
   android:background= "#0000ff" >
  </com.ethanlbb.toucheventtest.ChildView >
 </com.ethanlbb.toucheventtest.FatherView >
 
</RelativeLayout>

以上这篇android onTouchEvent处理机制总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# android  # ontouchevent  # Android onTouchEvent事件中onTouch方法返回值(介绍)  # Android运用onTouchEvent自定义滑动布局  # 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详  # 的是  # 将会  # 都是  # 给大家  # 将被  # 到此  # 会以  # 将该  # 法会  # 几个  # 在这里  # 不需要  # 中有  # 希望能  # 大神  # 做一个  # 这个时候  # 总会  # 为例  # 将以 


相关文章: 如何正确选择百度移动适配建站域名?  如何在云主机上快速搭建多站点网站?  如何在万网自助建站中设置域名及备案?  如何在腾讯云免费申请建站?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  建站之星后台管理系统如何操作?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  广州营销型建站服务商推荐:技术优势与SEO优化解析  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  电商平台网站制作流程,电商网站如何制作?  Python如何创建带属性的XML节点  宝塔新建站点为何无法访问?如何排查?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  定制建站哪家更专业可靠?推荐榜单揭晓  宝塔新建站点报错如何解决?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  制作证书网站有哪些,全国城建培训中心证书查询官网?  如何制作一个表白网站视频,关于勇敢表白的小标题?  婚礼视频制作网站,学习*后期制作的网站有哪些?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  常州自助建站工具推荐:低成本搭建与模板选择技巧  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何在万网ECS上快速搭建专属网站?  c# 在高并发场景下,委托和接口调用的性能对比  高端建站三要素:定制模板、企业官网与响应式设计优化  如何在建站主机中优化服务器配置?  盐城做公司网站,江苏电子版退休证办理流程?  如何获取PHP WAP自助建站系统源码?  如何用VPS主机快速搭建个人网站?  建站之星客服服务时间及联系方式如何?  小型网站制作HTML,*游戏网站怎么搭建?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  建站之星与建站宝盒如何选择最佳方案?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  建站主机空间推荐 高性价比配置与快速部署方案解析  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  简单实现Android文件上传  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  建站之星展会模版如何一键下载生成?  如何通过山东自助建站平台快速注册域名?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何通过FTP服务器快速搭建网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  北京企业网站设计制作公司,北京铁路集团官方网站?  PHP正则匹配日期和时间(时间戳转换)的实例代码  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  建站之星云端配置指南:模板选择与SEO优化一键生成 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。