首页 > 代码库 > View的事件处理机制笔记
View的事件处理机制笔记
View的事件处理机制:
首先得明白onTouch()和OnTouchEvent()有什么区别?
不管是什么控件都有dispatchTouchEvent()方法,当我们点击屏幕首先调用的也是这个方法。
那么,看看dispatchTouchEvent()方法的一段源码:
这就说明:
1.在dispatchTouchEvent()中,如果返回true,执行onTouch()方法;否则才执行onTouchEvent()方法,
也就是说,onTouch()优先于onTouchEvent()执行.
分别看看看按下ImageView和Button时onTouch()响应的次数:
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的事件处理机制笔记