view事件的处理机制
2015-12-05 14:26
399 查看
##以ImageView为例说明View的事件处理机制,ImageView中没有去重写dispatchTouchEvent(ev) view上的dispatchTouchEvent(ev)方法 public boolean dispatchTouchEvent(MotionEvent event) { ... //mOnTouchListener就是imageView调用setOnTouchListener传递进来的对象 //onTouch返回值结果由自己重写onTouch决定的,如果返回值为true,那当前if条件满足,直接返回true,即dispatchTouchEvent返回true // dispatchTouchEvent返回true,当前view响应所有事件 // 如果onTouch返回的false,顺序执行onTouchEvent(event),需要继续向下分发寻找目标view. if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&mOnTouchListener.onTouch(this, event)) { return true; } return onTouchEvent(event); } public void setOnTouchListener(OnTouchListener l) { mOnTouchListener = l; } imageView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.i(tag, "ImageView onTouch event = "+event.getAction()); return true; } }); public boolean onTouchEvent(MotionEvent event) { ... //当前控件是否可以被点击,如果可以被点击进入if,返回true,即dispatchTouchEvent(ev)返回true,当前view响应所有事件 //不可以被点击,不进入if,直接返回false,即dispatchTouchEvent(ev)返回false,当前view不响应所有事件 if (((viewFlags & CLICKABLE) == CLICKABLE || (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) { switch (event.getAction()) { case MotionEvent.ACTION_UP: ... //点击事件的调用方式,就是回调方法 performClick(); ... return true; } return false; } //imageView默认没有可点击的事件,但如果添加以下代码,就给其加上了点击事件 //其实就是调用View中setOnClickListener方法 public void setOnClickListener(OnClickListener l) { //加上可点击事件 if (!isClickable()) { setClickable(true); } mOnClickListener = l; } imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //在之前的OnTouchListener中的onTouch方法内部返回false,打印两次 } }); public boolean performClick() { .... if (mOnClickListener != null) { ... //回调onclick方法 mOnClickListener.onClick(this); ... } ... } ///上述是源码中的方法,dispatchTouchEvent作用是将touch事件向下传递直到遇到被触发的目标view, 如果返回true,表示当前view就是目标view,事件停止向下分发。 否则返回false,表示当前view不是目标view,需要继续向下分发寻找目标view.
相关文章推荐
- 【算法】任意大小的16进制数转8进制
- 使用RadioGroup和ViewPager打造主页界面效果
- SlidingMenu使用Demo
- 智能聊天机器人的实现(语音引入第三方科大讯飞)
- DIV 拖动效果
- mongodb格式化输出查询结果
- JS检测浏览器插件
- Java 常用面试题
- nginx的编译安装
- JAVA语法基础之流程控制
- java.io.IOException: 您的主机中的软件中止了一个已建立的连接
- Vitamio打造万能播放器使用步骤
- linux内核中的GPIO系统之(2):pin control subsystem
- Android 判断字符串是否数字
- Android View.onMeasure方法的理解
- Linux串口终端驱动——S3C6410平台
- 在内存中创建原图的副本
- c010-删边问题
- Firemonkey使用iOS的第三方静态库(Link Binary With Libraries)
- opencv矩阵的卷积