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

xmlns:tools="http://schemas.android.com/tools"

android:layout_width= "match_parent"

android:layout_height= "match_parent"

tools:context="${relativePackage}.${activityClass}" >

android:layout_width= "match_parent"

android:layout_height= "match_parent"

android:background= "@android:color/holo_blue_dark"

android:gravity= "center" >

android:layout_width= "200dp"

android:layout_height= "200dp"

android:layout_gravity= "center"

android:background= "#0000ff" >

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

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

ontouchevent android,android onTouchEvent处理机制总结(必看)相关推荐

  1. android 5.1 色盲,考驾照必看5色盲试题,要是第一张都能看错,这辈子和驾照无缘...

    考过驾照的都知道,所有的考试人员都要经过第一项体检测试,体检项目基本上包括你的身高,身体状况是否存在疾病或残疾,另一项就是要测试考试人员是否有色盲症,而测试色盲症的原因就是要辨认你对红绿灯的颜色能否辨 ...

  2. 【Android -- 面试】精心整理 Android 面试题(2022求职必看)

    前言 如今,Android 开发岗的就业形势逐渐严峻,不像前几年那么热门,但是高级人才依然紧缺.想要在众多面试者中脱颖而出,拿下大厂 offer,就必须全面梳理知识点,扩充题库,并针对面试中可能遇到的 ...

  3. android 平板怎么刷机,小白必看,安卓平板电脑刷机教程之一键刷机

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 从来没刷机的的小白,你有以下疑问吗? 什么是"刷机" 什么是"ROM" 什么是"ROOT" 什 ...

  4. android换iphone教程,换手机必看 Android转iPhone换机教程

    2.短信 微信只有备份通讯录的功能,第三方软件包括QQ同步助手等虽然支持通话记录.短信的备份,但是无法再Android和iOS之间互通,想要在不越狱的情况下完成短信的备份有些繁琐,接下来我们就为大家演 ...

  5. Android Studio入门教程(新手必看)

    上篇文章已经说过了Android Studio的安装配置,从这里开始我们就来完成第一个Android项目吧! 如何安装配置还不太熟悉的可以参考这篇文章:Android Studio安装配置详细步骤(超 ...

  6. android 开发者捐赠,[已更新][进站必看]ZArchiver Pro捐赠版 安卓解压缩[Android]

    软件介绍: ZArchiver是一款强大的压缩和解压缩软件,支持rar,zip,7z等等,不像androidzip一样解压7z错误,还支持带密码的rar压缩文件,支持中文文件名,(这是安卓上唯一的), ...

  7. MTK:架构和消息机制(必看)

    MTK 消息机制 MTK的架构其实有4大层次,最上一层为MMI层,此层包括各种框架已经应用(例如GUI框架,字体引擎等),下一层为L4层,此层作为MMI层与协议以及驱动通信的一扇大门.L4层细分为L4 ...

  8. Android中 onTouchEvent() 与 onInterceptTouchEvent()事件的区别详解

    1.onTouchEvent:触发触摸事件 onInterceptTouchEvent:触发拦截触摸事件 通过查看源代码及类继承关系 onInterceptTouchEvent:是定义于ViewGro ...

  9. Android Touch事件传递机制解析 (推荐)

    最近新闻列表里的下拉 down up  move 等等让我十分头疼 ,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把a ...

最新文章

  1. 数据结构算法 简单的面试思考题
  2. Atitit. 订单管理 收银单持久化 功能设计  基于ecshop订单结构
  3. python的面向对象编程学生成绩_python的类_面向对象编程
  4. 如何跳过无用的字符信息
  5. 联想天工 802.1x认证 主程序
  6. Python面试题(第二篇)
  7. Java 集合容器篇面试题(上)-王者笔记《收藏版》
  8. ReentrantLock类源码解析
  9. Unity,基于layer的碰撞配置
  10. 3.以每行一个单词的形式打印其输入
  11. Ruby gem 更换国内源
  12. python pdf转txt_Python实现pdf文档转txt的方法示例
  13. “磁碟机”病毒技术分析报告
  14. maven-replacer-plugin 静态资源打包方案js css
  15. 华为云免费SSL域名证书申请_亲测成功
  16. 浅谈统计检验效能和FDR
  17. IDEA代码以及注释格式化,行宽设置,以及自动换行
  18. 7-20 简单计算器
  19. 禁用计算机外部设备,禁用扫描仪的多种方法
  20. 2019互联网校招薪资表: BAT、华为还没有TMD高

热门文章

  1. 光纤激光切机计算机无法启动,激光切割机不出光,如何解决?
  2. 第五讲 Python中的字符串(一)
  3. Java8 Lambda 表达式
  4. Thread 中的run() 与start() 方法
  5. JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码)
  6. OpenCASCADE:使用 扩展数据交换XDE之编辑形状
  7. wxWidgets:wxRearrangeDialog类用法
  8. Boost.Signals 的文档/查看示例
  9. boost::mpi::wait_any相关用法的测试程序
  10. boost::multiprecision::float128用法的测试程序