Android事件分发机制
2016-04-24 16:27
330 查看
我们在MainActivity中注册一个Button按钮,分别为它设置onClick和onTouch事件
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.dispatch_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.v("TAG", "onClick");
}
});
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
Log.v("TAG", String.valueOf(event.getAction()));
return false;
}
});
}
onTouch事件会比onClick更优先执行,而且只有onTouch返回false的时候,onClick才会被执行,原因是,view在被点击后,都会调用dispatchTouchEvent方法,
if (onFilterTouchEventForSecurity(event)) {
//noinspection SimplifiableIfStatement
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
}
回调onTouch方法以后,如果返回true,那么onTouchEvent将不会被执行,其内部包含了第一个监听器的onClick方法,直接会被忽略不执行,该按钮被按下后,ACTION_DOWN,ACTION_UP,ACTION_MOVE会被反复执行,也即事件会被反复分发,这里为什么每次onTouchEvent被执行,onClick却只被执行一次,原因是onTouchEvent方法中会判断是ACTION_DOWN,ACTION_UP,,只有ACTION_UP中才执行了performClick方法,该方法执行了clickListener中的onClick方法。
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.dispatch_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.v("TAG", "onClick");
}
});
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
Log.v("TAG", String.valueOf(event.getAction()));
return false;
}
});
}
onTouch事件会比onClick更优先执行,而且只有onTouch返回false的时候,onClick才会被执行,原因是,view在被点击后,都会调用dispatchTouchEvent方法,
if (onFilterTouchEventForSecurity(event)) {
//noinspection SimplifiableIfStatement
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
}
回调onTouch方法以后,如果返回true,那么onTouchEvent将不会被执行,其内部包含了第一个监听器的onClick方法,直接会被忽略不执行,该按钮被按下后,ACTION_DOWN,ACTION_UP,ACTION_MOVE会被反复执行,也即事件会被反复分发,这里为什么每次onTouchEvent被执行,onClick却只被执行一次,原因是onTouchEvent方法中会判断是ACTION_DOWN,ACTION_UP,,只有ACTION_UP中才执行了performClick方法,该方法执行了clickListener中的onClick方法。
相关文章推荐
- Android 使用系统摄像头拍相片与拍视频,并显示
- Android高效加载大图、多图解决方案,有效避免程序OOM
- android自定义View之钟表诞生记
- android自定义View之钟表诞生记
- android自定义View之钟表诞生记
- android自定义View之钟表诞生记
- 关于Android Studio导入源码的问题解决
- Android几种常见的多渠道(批量)打包方式介绍
- Android应用中使用ListView来分页显示刷新的内容
- Android Studio 导入各种形式的三方库
- Android ContentProvider基础
- android 中通过代码创建控件
- android 数组排序
- 欧盟与谷歌之间的 Android 反垄断案,或改变谷歌的 Android 业务模式
- Android调用摄像头和相册
- 安卓中的:内存泄漏 和 内存溢出
- android studio学习----偏好设置
- 离线安装 Android Studio 更新
- device unauthorized & ANDROID_ADB_SERVER_PORT 问题解决
- Android中实现下载URL地址的网络资源的实例分享