• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android触摸事件分发机制完全解析《一》

Android触摸事件分发机制完全解析《一》

作者:androidstarjack的专栏 字体:[增加 减小] 来源:互联网 时间:2017-07-22

androidstarjack的专栏通过本文主要向大家介绍了android,View,View-解析等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

最近在做高德地图的时候,由于用户的要求,不得不用ScrollVew嵌套MapView,虽然很官方要求不建议这样做,但也迫于无奈… 魔高一尺,道高一丈.有什么事是程序员不能解决的,如果有那就是解决两次.

鉴于用到了触摸事件,于是就来总结了Android的触摸事件机制.

首先当用户进行屏幕操作的时候,则有两种情况

  • 一是按键事件

  • 二是触摸事件

按键事件分为长按和点击事件,过于简单,这里不再进行总结.

触摸事件

触摸事件的组成:
- 一个actionDown
- n个actionMove
- 一个actionUp
- 一个onClick
- 一个onLongClick
- 一个onScroll

Android组件

  • 继承 ViewGroupo比如LinearLayout,ScrollView,GridView,extends–>ViewGroup的View
  • ViewGroup容器
  • 继承于 View不包含其他的View ,如TextView,Edittext,Butto等

下面介绍一个讲的好的一个博客地址:

http://www.trinea.cn/android/touch-event-delivery-mechanism/

MotionEvent

所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置、时间、历史记录以及第几个手指(多指触摸)等。

Android 事件的处理的分类

  • 分发(很多人也称作为传递事件) : dispatchTouchEvent函数

  • 消费: onTouchEvent函数和OnTouchListener函数

  • 拦截:onInterceptTouchEvent函数

我们都知道Android的触摸事件都是从外层传递到内层:由最外层的Activity——>ViewGroup——> ViewGroupo——>…….View.

第一触摸事件传递的开始一定是Activity;

第二传递方式是通过隧道方式传递;

第三一直传递到一个最外层的View,也就是顶级View,由该View的这个方法来进行分发。

对于Activity来说:


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean isFlag = super.dispatchTouchEvent(ev);
        return isFlag;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean isFlag = super.onTouchEvent(event);
        return isFlag;
    }

对于ViewGroup来说:

  @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean isFlag =super.onTouchEvent(event);
        return  isFlag;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        boolean isFlag =super.onInterceptTouchEvent(event);
        return  isFlag;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        boolean isFlag =super.dispatchTouchEvent(event);
        return  isFlag;
    }

对于View来说和Activity一样,只有消费和拦截


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean isFlag = super.dispatchTouchEvent(ev);
        return isFlag;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean isFlag = super.onTouchEvent(event);
        return isFlag;
    }

http://www.open-open.com/lib/view/open1463016891525.html

android中的Touch事件都是从ACTION_DOWN开始的:

单手指操作:ACTION_DOWN—ACTION_MOVE—-ACTION_UP

多手指操作:ACTION_DOWN—ACTION_POINTER_DOWN—ACTION_MOVE–ACTION_POINTER_UP—ACTION_UP.

如果都不进行拦截,都不消费的基本流程图:

Markdown

下面我们就用案例进行分析:

activity—-》ViewGroup(MyLinearLayout)—》ViewGroup(MySubView)

MyLinearLayout的dispatchTouchEvent返回false。

Markdown

打印结果:

Markdown

  • 过程及结果分析:

  • 事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的dispatchTouchEvent;

  • 而该TouchEventFather 控件的 dispatchTouchEvent 返回 false,表示对获取到的事件停止向下传递,同时也不对该事件进行消费;

  • 由于 TouchEventFather 获取的事件直接来自 TouchEventActivity ,则会将事件返回给 TouchEventActivity 的 onTouchEvent 进行消费;

  • 最后直接由 TouchEventActivity 来响应手指移动和抬起事件。

MyLinearLayout的dispatchTouchEvent返回true。

Markdown

打印结果:

Markdown

  • 过程及结果分析:

  • 事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent;

  • 而该TouchEventFather 控件的 dispatchTouchEvent 返回 true,表示分发事件到 TouchEventFather 控件并由该控件的 dispatchTouchEvent 进行消费;

  • 又因为TouchEventActivity 不断的分发事件到 TouchEventFather 控件的 dispatchTouchEvent,而 TouchEventFather 控件的 dispatchTouchEvent 也不断的将获取到的事件进行消费。

MyLinearLayout的onInterceptTouchEvent返回true。

Markdown

打印结果:

Markdown

  • 过程及结果分析:

  • 事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent;

  • 而该TouchEventFather 控件的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),表示对事件进行分发并向下传递给 TouchEventFather 控件的 onInterceptTouchEvent 方法;

  • 而该方法返回 true 表示对所获取到的事件进行拦截并将事件传递给 TouchEventFather 控件的 onTouchEvent 进行处理,TouchEventFather 控件的 onTouchEvent 返回 super.onTouchEvent(ev) 表示对事件没有

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android:手把手教你 实现Activity 与 Fragment 相互通信(含Demo)
  • android自定义圆角背景实现富文本标题展示
  • 自定义收集用户行为统计库 (非常方便 可以自己拓展)
  • Android 6.0 Phone"通话显示"查询流程
  • Android缓存处理
  • 自定义进度条PictureProgressBar——从开发到开源发布全过程
  • 详解Android中的SQLite数据库存储
  • Android设备上获取照片、裁剪图片、压缩图片
  • Android触摸事件分发机制完全解析《一》
  • Android-SQLite和SQLiteOpenHelper

相关文章

  • 2017-05-26arcgis andriod 加载影像,arcgisandriod
  • 2017-05-26手机影音2--软件架构分析,影音2--架构分析
  • 2017-05-26Kotlin怎样使用Android的Dagger2,kotlindagger2
  • 2017-05-26第二个activity,启动第二个activity
  • 2017-05-26转载:内存泄露与内存溢出的区别,转载泄露溢出区别
  • 2017-05-26androidj基础:从网上下载图片,
  • 2017-05-26Linux内核系列—4.操作系统开发之LDT,linuxldt
  • 2017-05-26XAMARIN.ANDROID SIGNALR 实时消息接收发送示例,xamarinsignalr
  • 2017-05-26Android 之 图片压缩
  • 2017-05-26从零开始怎么写android native service?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 酷欧天气(CoolWeather)应用源码,coolweather
    • android http下载视频到指定目录,android目录
    • Fragment分解使用,fragment分解
    • 4.5.1 Intent的基本使用
    • Android天天数钱游戏项目源码,android项目源码
    • Hello,Android
    • Android--使用XMLPull解析xml
    • PHP的readfile下载大文件时卡住
    • Android中BroadcastReceiver的两种注册方式(静态和动态)详解,broadcastreceiver
    • Android中使用Notification实现普通通知栏(Notification示例一),rest示例java实现

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有