Android的事件响应机制

1:View的事件响应机制(控件:如TextView,ImageView,Button等)

在执行onTouchListener方法时候,(view这里代表为控件)

view.setOnTouchListener (new OnTouchListener() {

@Override

public boolean onTouch( View v, MotionEvent event) {

return false ;

}

});

事件分发的时候会执行publicboolean dispatchTouchEvent(MotionEvent event)

a:先进行if判断

if (li != null && li .mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED

&& li .mOnTouchListener .onTouch (this, event)) {

return true ;

}

return onTouchEvent(event) ;

li就是OnTouchListener的实现类,不为null,第二个条件判断控件是否可用,一般恒成立,主要就看第三个条件了。

return true:就代表响应所有事件。

return false:就会执行onTouchEvent方法了。

b:setOnTouchListener方法返回了false

在onTouchEvent方法中,如果控件具备点击事件,在action_up中回调执行onClick的点击事件,并且返回true,响应所有事件。如果控件不具备点击事件,就会返回false,也进入不了switch中。

2:ViewGroup的事件响应机制

     

ViewGroup的事件响应机制主要分为2部分:1:ViewGroup拦截了事件,2:ViewGroup没有拦截事件

/*

* return true  拦截了事件

* return false 没有拦截事件,往内部传递

*/

@Override

public boolean onInterceptTouchEvent( MotionEvent ev) {

return true ;

}

1:拦截了事件:

那么ViewGroup就会去处理事件,在源码中最后还是调用View的dispatchTouchEvent方法,由其决定是否响应,onTouchEventListener中return了true,就响应了事件,return了false,那么就去判断当前控件(布局)是不是可以被点击,测试了一次ListView,ListView点击的时候响应了事件。ListView无论是不是中断,都会由View的dispatchTouchEvent方法决定,ListView可以被点击。

2:没有拦截事件:

    最外层的ViewGroup先捕获到事件,计算出点击的位置,遍历自己的孩子,传递给对应的ViewGroup,然后第二层是不是拦截啊?不拦截,继续遍历,找到具体点击的地方的控件view。

控件view会去通过View的dispatchTouchEvent方法的返回值判断是不是响应了点击事件,return true;响应了,那么结束了。如果return false;了没有响应,那么事件会向回传递,自己的父亲回去尝试响应了。同样,通过dispatchTouchEvent来进行决定是不是响应了事件。

示例代码:

1:拦截事件

自定义控件

public class MyLinearLayout extends LinearLayout {

public MyLinearLayout (Context context , AttributeSet attrs ) {

super(context , attrs );

}

@Override

public boolean onInterceptTouchEvent( MotionEvent ev) {

return true ;

}

}

MainActivity

public class MainActivity extends Activity {

private LinearLayout my_ll;

private Button button;

private TextView textView;

@Override

protected void onCreate( Bundle savedInstanceState) {

super.onCreate (savedInstanceState );

setContentView (R .layout .activity_main);

my_ll = (LinearLayout ) findViewById (R .id .my_ll);

button = (Button ) findViewById (R .id .button);

textView = (TextView ) findViewById (R .id .text);

my_ll. setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch( View v, MotionEvent event) {

System .out.println( "Linearlayout:"+event .getAction ());

return true ;

}

});

textView. setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch( View v, MotionEvent event) {

System .out.println( "TextView:"+event .getAction ());

return false ;

}

});

button. setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch( View v, MotionEvent event) {

System .out.println( "Button:"+event .getAction ());

return false ;

}

});

//         my_ll.setOnClickListener(new OnClickListener() {

//

//              @Override

//              public void onClick(View v) {

//                   System.out.println(" Linearlayout");

//              }

//         });

}

}

分析:my_ll不再向里面的Button和TextView传递了,自己处理,自己在my_ll.setOnTouchListener中返回了false,my_ll又不具备点击事件,当然就只能打印出LineraLayout::0了,如果我们给其设置了点击事件,那么当然会打印出down,up,click三者了。my_ll.setOnTouchListener中返回了true,自己也进行了处理,不过就只能打印出down,up了。


2:不拦截事件

分析:点击button,响应了事件,其可以点击,肯定会响应。点击TextView时候,其默认没有点击事件,只能打印down了,然后不响应,往回传递,my_ll去响应,my_ll又会通过View的dispatchTouchEvent去处理了。我们这里在my_ll.setOnTouchListener中返回了true的话,肯定会打印如下:TextView的down,MyLinearlayout的down,up了。

时间: 2024-10-20 06:23:33

Android的事件响应机制的相关文章

Android MotionEvent事件响应机制

在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action_move),抬起(action_up).各种响应归根结底都是基于View以及ViewGroup的,这两者中响应的方法分别有: View.java中: publi boolean dispatchTouchEvent(MotionEvent event) public boolean onTouch

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

Android触摸事件分发机制

Android中的事件分为按键事件和触摸事件,这里对触摸事件进行阐述.Touch事件是由一个ACTION_DOWN,n个ACTION_MOVE,一个ACTION_UP组成onClick,onLongClick,onScroll等事件.Android中的控件都是继承View这个基类的,而控件分为两种:一种是继承View不能包含其他控件的控件:一种是继承ViewGroup可以包含其他控件的控件,暂且称为容器控件,比如ListView,GridView,LinearLayout等. 这里先对几个函数讲

Android View 事件分发机制源码详解(View篇)

前言 在Android View 事件分发机制源码详解(ViewGroup篇)一文中,主要对ViewGroup#dispatchTouchEvent的源码做了相应的解析,其中说到在ViewGroup把事件传递给子View的时候,会调用子View的dispatchTouchEvent,这时分两种情况,如果子View也是一个ViewGroup那么再执行同样的流程继续把事件分发下去,即调用ViewGroup#dispatchTouchEvent:如果子View只是单纯的一个View,那么调用的是Vie

Android touch 事件传递机制

前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事件进行拦截.这个时候我们就需要明白android touch 事件传递机制, (2)以前很多时候比较模糊,也许是网上看到也有很多事件传递的相关文章,但我看着头晕,解释不彻底,有的说得一半,总算不满足不满意,于是据我自己的理解来彻底的来整理下具体的是怎么个传递方式,分享给大家,希望大家看到有什么不对的

Android View 事件分发机制 源码解析 (上)

一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志~ MyButton [java] view plain copy package com.example.zhy_event03; import android.content.Context; import andr

【转】Android Touch事件传递机制解析

原文地址:http://www.cnblogs.com/runssnail/p/4250549.html 说明:本文在原文地址上有所改动 一.小故事 在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给了自己组员(程序员) 程序员:分派给了自己带的实习生. 实习生:好苦逼,无法分派,怎么办啊?只能自己干了 但是实习生能不能做好,有两种情况了. 情况一:

Android触摸屏事件派发机制详解与源码分析

请看下面三篇博客,思路还是蛮清晰的,不过还是没写自定义控件系列哥们的思路清晰: Android触摸屏事件派发机制详解与源码分析一(View篇) http://blog.csdn.net/yanbober/article/details/45887547 Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇) http://blog.csdn.net/yanbober/article/details/45912661 Android触摸屏事件派发机制详解与源码分析三(Activi

Anroid View事件响应机制和ViewGroup的事件响应分发机制

注:低版本的源码内容比高版本的源码简单,分析起来方便,但是高版本源码更为严密. View的事件响应机制 涉及2个方法dispatchTouchEvent和onTouchEvent 1.View的dispatchTouchEvent方法(事件传递到View,View的这个方法就自动执行.) dispatchTouchEvent返回true,响应事件:返回false,不响应事件. public boolean dispatchTouchEvent(MotionEvent event) { ... L