View的事件传递机制
来源:互联网 发布:php扩展加密 编辑:程序博客网 时间:2024/05/19 17:26
package com.songyan.getcontacts;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.TextView;/** * Created by songyan on 2017/10/30. */public class MyTextView extends TextView { private static final String TAG="MyTextView"; public MyTextView(Context context){ super(context); } public MyTextView(Context context, AttributeSet attrs){ super(context,attrs); } @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG,"dispatchTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_UP: Log.e(TAG,"dispatchTouchEvent ACTION_UP"); break; case MotionEvent.ACTION_MOVE: Log.e(TAG,"dispatchTouchevetn ACTION_MOVE"); break; case MotionEvent.ACTION_CANCEL: Log.e(TAG,"dispatchTouchevetn ACTION_CANCEL"); break; default: break; } return super.dispatchTouchEvent(event); //return true; //return false; } @Override public boolean onTouchEvent(MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG,"onTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_UP: Log.e(TAG,"onTouchEvent ACTION_UP"); break; case MotionEvent.ACTION_MOVE: Log.e(TAG,"onTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_CANCEL: Log.e(TAG,"onTouchEvent ACTION_CANCEL"); break; default: break; } return super.onTouchEvent(event); //return true; //return false; }}
package com.songyan.getcontacts;import android.app.Activity;import android.os.Bundle;import android.provider.ContactsContract;import android.util.Log;import android.view.MotionEvent;import android.view.View;/** * Created by songyan on 2017/10/13. */public class MainActivity extends Activity implements View.OnClickListener,View.OnTouchListener{ private static final String TAG="MainActivity"; private MyTextView mMyTextView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); mMyTextView=(MyTextView)findViewById(R.id.myTextView); mMyTextView.setText("hello"); mMyTextView.setOnClickListener(this); mMyTextView.setOnTouchListener(this); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG,"dispatchTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.e(TAG,"dispatchTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.e(TAG,"dispatchTouchEvent ACTION_UP"); break; default: break; } return super.dispatchTouchEvent(ev); //return true; //return false; } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG,"onTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.e(TAG,"onTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.e(TAG,"onTouchEvent ACTION_UP"); break; default: break; } return super.onTouchEvent(event); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.myTextView: Log.e(TAG,"MyTextView onClick"); break; default: break; } } @Override public boolean onTouch(View v, MotionEvent event) { switch(v.getId()){ case R.id.myTextView: switch (event.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG,"MyTextView onTouch ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.e(TAG,"MyTextView onTouch ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.e(TAG,"MyTextView onTouch ACTION_UP"); break; default: break; } break; default: break; } return false; //return true; }
1)按当前代码执行
(MainActivity dispatchTouchEvent return super方法 //分发给子视图
MyTextView dispatchTouchEvent return super方法 //调用当前视图的onTouch方法
MainActivity: MyTextView onTouch return false //调用当前视图的onTouchEvent方法
MyTextView onTouchEvent return super方法)
对应log:
10-31 04:21:52.553 8859-8859/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
10-31 04:21:52.554 8859-8859/? E/MyTextView: dispatchTouchEvent ACTION_DOWN //分发给子视图
10-31 04:21:52.554 8859-8859/? E/MainActivity: MyTextView onTouch ACTION_DOWN //调用当前视图的onTouch方法
10-31 04:21:52.554 8859-8859/? E/MyTextView: onTouchEvent ACTION_DOWN //调用当前视图的onTouchEvent方法
10-31 04:21:52.578 8859-8859/? E/MainActivity: dispatchTouchEvent ACTION_MOVE
10-31 04:21:52.578 8859-8859/? E/MyTextView: dispatchTouchevetn ACTION_MOVE
10-31 04:21:52.578 8859-8859/? E/MainActivity: MyTextView onTouch ACTION_MOVE
10-31 04:21:52.578 8859-8859/? E/MyTextView: onTouchEvent ACTION_MOVE
10-31 04:21:52.669 8859-8859/? E/MainActivity: dispatchTouchEvent ACTION_UP
10-31 04:21:52.669 8859-8859/? E/MyTextView: dispatchTouchEvent ACTION_UP
10-31 04:21:52.669 8859-8859/? E/MainActivity: MyTextView onTouch ACTION_UP
10-31 04:21:52.669 8859-8859/? E/MyTextView: onTouchEvent ACTION_UP
10-31 04:21:52.670 8859-8859/? E/MainActivity: MyTextView onClick
2.MainActivity dispatchTouchEvent return true/false 其他同1
(表示对事件不进行分发操作)
对应log:
10-31 07:50:28.550 10411-10411/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
10-31 07:50:28.562 10411-10411/? E/MainActivity: dispatchTouchEvent ACTION_MOVE
10-31 07:50:28.719 10411-10411/? E/MainActivity: dispatchTouchEvent ACTION_UP
3.MyTextView dispatchTouchEvent return true 其他同1
(事件被当前视图消费掉。不对事件进行分发操作)
对应log:
10-31 08:15:13.751 10797-10797/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
10-31 08:15:13.754 10797-10797/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
10-31 08:15:13.778 10797-10797/? E/MainActivity: dispatchTouchEvent ACTION_MOVE
10-31 08:15:13.780 10797-10797/? E/MyTextView: dispatchTouchevetn ACTION_MOVE
10-31 08:15:13.832 10797-10797/? E/MainActivity: dispatchTouchEvent ACTION_UP
10-31 08:15:13.833 10797-10797/? E/MyTextView: dispatchTouchEvent ACTION_UP
4.MyTextView dispatchTouchEvent return false 其他同1
(表示MyTextView的dispatchTouchEvent方法不对触摸事件进行分发操作,
同时当前视图也没对事件进行处理,而是传给父视图的onTouchEvent方法进行事件处理)
对应log:
10-31 08:17:13.902 10998-10998/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
10-31 08:17:13.903 10998-10998/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
10-31 08:17:13.903 10998-10998/? E/MainActivity: onTouchEvent ACTION_DOWN
10-31 08:17:13.918 10998-10998/? E/MainActivity: dispatchTouchEvent ACTION_MOVE
10-31 08:17:13.918 10998-10998/? E/MainActivity: onTouchEvent ACTION_MOVE
10-31 08:17:14.071 10998-10998/? E/MainActivity: dispatchTouchEvent ACTION_UP
10-31 08:17:14.071 10998-10998/? E/MainActivity: onTouchEvent ACTION_UP
5.MainActivity: MyTextView onTouch return true 其他同1
(表示MyTextView的onTouch方法对触摸事件进行处理)
对应log:
10-31 09:19:37.123 12071-12071/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
10-31 09:19:37.125 12071-12071/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
10-31 09:19:37.126 12071-12071/? E/MainActivity: MyTextView onTouch ACTION_DOWN
10-31 09:19:37.146 12071-12071/? E/MainActivity: dispatchTouchEvent ACTION_MOVE
10-31 09:19:37.148 12071-12071/? E/MyTextView: dispatchTouchevetn ACTION_MOVE
10-31 09:19:37.148 12071-12071/? E/MainActivity: MyTextView onTouch ACTION_MOVE
10-31 09:19:37.302 12071-12071/? E/MainActivity: dispatchTouchEvent ACTION_UP
10-31 09:19:37.302 12071-12071/? E/MyTextView: dispatchTouchEvent ACTION_UP
10-31 09:19:37.302 12071-12071/? E/MainActivity: MyTextView onTouch ACTION_UP
6.MainActivity: MyTextView onTouch return false 同1
(表示MyTextView的onTouch方法不对触摸事件进行处理,传给同一个视图的onTouchEvent方法进行事件处理)
对应log:
10-31 04:21:52.553 8859-8859/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
10-31 04:21:52.554 8859-8859/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
10-31 04:21:52.554 8859-8859/? E/MainActivity: MyTextView onTouch ACTION_DOWN
10-31 04:21:52.554 8859-8859/? E/MyTextView: onTouchEvent ACTION_DOWN
10-31 04:21:52.578 8859-8859/? E/MainActivity: dispatchTouchEvent ACTION_MOVE
10-31 04:21:52.578 8859-8859/? E/MyTextView: dispatchTouchevetn ACTION_MOVE
10-31 04:21:52.578 8859-8859/? E/MainActivity: MyTextView onTouch ACTION_MOVE
10-31 04:21:52.578 8859-8859/? E/MyTextView: onTouchEvent ACTION_MOVE
10-31 04:21:52.669 8859-8859/? E/MainActivity: dispatchTouchEvent ACTION_UP
10-31 04:21:52.669 8859-8859/? E/MyTextView: dispatchTouchEvent ACTION_UP
10-31 04:21:52.669 8859-8859/? E/MainActivity: MyTextView onTouch ACTION_UP
10-31 04:21:52.669 8859-8859/? E/MyTextView: onTouchEvent ACTION_UP
10-31 04:21:52.670 8859-8859/? E/MainActivity: MyTextView onClick
在onTouch返回false的前提下,MyTextView的onTouchEvent方法
返回super方法,会调用到MyTextView的onClick方法,如6所示
返回true或者false,不会调用到onClick方法,如7,8所示
7.MyTextView onTouchEvent return true 其他同1
(表示当前视图可以处理对应的事件,事件将不会向上传递给父视图)
对应log:
10-31 09:24:06.653 12237-12237/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
10-31 09:24:06.660 12237-12237/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
10-31 09:24:06.660 12237-12237/? E/MainActivity: MyTextView onTouch ACTION_DOWN
10-31 09:24:06.660 12237-12237/? E/MyTextView: onTouchEvent ACTION_DOWN
10-31 09:24:06.682 12237-12237/? E/MainActivity: dispatchTouchEvent ACTION_MOVE
10-31 09:24:06.684 12237-12237/? E/MyTextView: dispatchTouchevetn ACTION_MOVE
10-31 09:24:06.684 12237-12237/? E/MainActivity: MyTextView onTouch ACTION_MOVE
10-31 09:24:06.684 12237-12237/? E/MyTextView: onTouchEvent ACTION_MOVE
10-31 09:24:06.793 12237-12237/? E/MainActivity: dispatchTouchEvent ACTION_UP
10-31 09:24:06.793 12237-12237/? E/MyTextView: dispatchTouchEvent ACTION_UP
10-31 09:24:06.793 12237-12237/? E/MainActivity: MyTextView onTouch ACTION_UP
10-31 09:24:06.793 12237-12237/? E/MyTextView: onTouchEvent ACTION_UP
8.MyTextView onTouchEvent return false 其他同1
(表示当前视图不处理这个事件,事件将会向上传递给父视图的onTouchEvent方法进行处理)
对应log:
10-31 09:28:54.884 12400-12400/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
10-31 09:28:54.885 12400-12400/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
10-31 09:28:54.885 12400-12400/? E/MainActivity: MyTextView onTouch ACTION_DOWN
10-31 09:28:54.885 12400-12400/? E/MyTextView: onTouchEvent ACTION_DOWN
10-31 09:28:54.885 12400-12400/? E/MainActivity: onTouchEvent ACTION_DOWN
10-31 09:28:54.905 12400-12400/? E/MainActivity: dispatchTouchEvent ACTION_MOVE
10-31 09:28:54.906 12400-12400/? E/MainActivity: onTouchEvent ACTION_MOVE
10-31 09:28:55.011 12400-12400/? E/MainActivity: dispatchTouchEvent ACTION_UP
10-31 09:28:55.011 12400-12400/? E/MainActivity: onTouchEvent ACTION_UP
阅读全文
0 0
- View的事件传递机制
- View的事件传递机制
- View的事件传递机制
- view的事件传递机制
- View的事件传递机制
- View的事件传递机制
- View事件传递机制
- View 事件传递机制
- View事件传递机制
- 嵌套view之间的事件传递机制
- 深入理解 View 的事件传递机制
- View的事件传递机制总结
- Android View事件分发机制--点击事件的传递规则
- Android View 事件传递机制
- Android View事件传递机制
- Android-view事件传递机制
- 【Android View】 事件传递机制
- 浅谈View事件传递机制
- cookie和servlet
- Java设计模式(五) 组合模式
- java(11):tomcat简介与使用(上)
- ios TestFlight的使用
- Javassist的用法
- View的事件传递机制
- 反编译工具ILSpy下载
- @Controller和@RestController的区别?
- 6-1 PTA 单链表逆转
- Restful API SpringMVC多版本实现
- base64图片压缩
- 链式存储结构的特点
- css控制元素垂直居中的几种方法
- 自定义TextView任意长度文本下自动改变文字大小以完全显示