码迷,mamicode.com
首页 > 其他好文 > 详细

View的事件处理机制笔记

时间:2014-11-03 01:21:22      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   for   sp   strong   on   

View的事件处理机制:

首先得明白onTouch()和OnTouchEvent()有什么区别?
不管是什么控件都有dispatchTouchEvent()方法,当我们点击屏幕首先调用的也是这个方法。

那么,看看dispatchTouchEvent()方法的一段源码:

bubuko.com,布布扣

这就说明:
1.在dispatchTouchEvent()中,如果返回true,执行onTouch()方法;否则才执行onTouchEvent()方法,
也就是说,onTouch()优先于onTouchEvent()执行.

分别看看看按下ImageView和Button时onTouch()响应的次数:

bubuko.com,布布扣

 

bubuko.com,布布扣
2.当我们分别点击iv和button,通过打印出来的结果知道,点击事件是在onTouchEvent()里面执行的。
onTouch()返回true时控件响应2次,否则响应1次.
当给View控件设置点击事件后,所有控件都相应2次.

Button也不例外,因为系统默认给Button返回了一个true

 

以下是粗略的源码分析:
View上setOnTouchListener方法
public void setOnTouchListener(OnTouchListener l) {
mOnTouchListener = l;
}

iamgeView调用view上面setOnTouchListener方法,并且将指定对象传递进去
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//返回true,导致事件全部被响应
return false;
}
});


mOnTouchListener从何处获取??
public boolean dispatchTouchEvent(MotionEvent event) {
....
//mOnTouchListener不为空,并且当前控件可用,onTouch方法对应得返回值
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
//如果if对于逻辑不成立,调用onTouchEvent
//onTouch先于onTouchEvent,并且觉得当前onTouchEvent是否调用
return onTouchEvent(event);
}

 

public boolean onTouchEvent(MotionEvent event) {
....
//判断当前控件是否有点击事件,如果有则执行if中逻辑,如果没有则不执行返回false
if (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
switch (event.getAction()) {
//点击事件触发点
case MotionEvent.ACTION_UP:
...
performClick();
...
}
//此处返回true则说明onTouchEvent,说明dispatchTouchEvent返回true,则响应所有事件
return true;
}
//此处返回false,等同于onTouchEvent,dispatchTouchEvent返回false,不响应所有事件
return false;
}


//view中setOnClickListener方法
public void setOnClickListener(OnClickListener l) {
//如果当前控件没有点击事件,设置一个点击事件
if (!isClickable()) {
setClickable(true);
}
mOnClickListener = l;
}
//给指定的iamgeView去设置一个点击事件,去掉用view上setOnClickListener方法
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
...
}
});

//点击事件的处理规则,mOnClickListener什么时候传递进来的??
public boolean performClick() {
...
if (mOnClickListener != null) {
....
mOnClickListener.onClick(this);
...
}
...
}

 

View的事件处理机制笔记

标签:style   blog   http   io   color   for   sp   strong   on   

原文地址:http://www.cnblogs.com/ncurenhe228/p/4070341.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!