您的位置:首页 > 移动开发 > Android开发

Android 事件分发 OnClickListener 和 OnTouchListener 的事件处理原理简单描述

2014-05-03 15:45 489 查看
声明:下文是在看过这篇文章 /article/1562152.html 的一个总结,所以有需要做进一步了解者,可以直接去看一下

在这次的实验练习中,我们只采用了一个 Button 的事件来做分析

1.先给Button添加相应的事件:

private Button testBtn;
testBtn = (Button)findViewById(R.id.testBtn);
testBtn.setOnClickListener(new MyClickListener());
testBtn.setOnTouchListener(new MyTouchListener());

class MyTouchListener implements OnTouchListener {

@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("event dispatch", "onTouch : "+event.getAction());
return true;
}

}

class MyClickListener implements OnClickListener {

@Override
public void onClick(View arg0) {
Log.d("event dispatch", "onClick");
}

}




2.运行结果
把上面的代码写好后,直接运行项目,在 LogCat 中可以看到如下结果



在上面两个监听者的事件处理方法中,onTouch 是有返回值的,而 onClick 没有,其实这个返回值决定着 onClick 方法能否被执行,上面代码中返回值为false,下面我们把这个返回值改成true,再次运行之后会发现如下结果



现在,我们就可以清楚的看到,如果 onTouch 返回值是 true 时,onClick 方法将不被执行,下面我们讲一下原理(可能描述不是太准确,不过大概是那么回事)

3. 逻辑描述

其实在 View 这个类里面,有个方法叫做 dispatchTouchEvent(Event),当你点击 Button 时就会触发了这个方法(Button 间接继承于 View),dispatchTouchEvent 会先去回调我们添加到 Button 上的OnTouchListener 的 onTouch 方法(如果有添加的话),然后根据方法返回值来确定是否调用 View 自身的onTouchEvent 方法, 而OnClickListener
的 onClick 方法是要通过 onTouchEvent 方法才能被调用,如上所演示的:返回值为 true 不会回调 onClick,返回 false 时才会回调(如果没有注册添加到 OnTouchListener ),即只有当 onTouch 返回的是 false, onTouchEvent 方法才会被调用,估计看到这里大家都要晕了,下面附一张图,应该就会清晰。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: