ViewGroup的事件传递机制
来源:互联网 发布:第三方软件是什么意思 编辑:程序博客网 时间:2024/06/05 11:59
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.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.RelativeLayout;/** * Created by songyan on 2017/11/1. */public class MyRelativeLayout extends RelativeLayout { private static final String TAG="MyRelativeLayout"; public MyRelativeLayout(Context context){ super(context); } public MyRelativeLayout(Context context, AttributeSet attrs){ super(context,attrs); } @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.d(TAG,"dispatchTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG,"dispatchTouchEvent ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG,"dispatchTouchEvent ACTION_CANCEL"); break; default: break; } return super.dispatchTouchEvent(ev); //return true; //return false; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: Log.e(TAG,"onInterceptTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG,"onInterceptTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG,"onInterceptTouchEvent ACTION_UP"); break; default: break; } return super.onInterceptTouchEvent(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.d(TAG,"onTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG,"onTouchEvent ACTION_UP"); break; default: break; } return super.onTouchEvent(event); //return true; //return false; }}
<?xml version="1.0" encoding="utf-8"?><com.songyan.getcontacts.MyRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.songyan.getcontacts.MyTextView android:id="@+id/myTextView" android:layout_width="match_parent" android:layout_height="50sp"> </com.songyan.getcontacts.MyTextView></com.songyan.getcontacts.MyRelativeLayout>
package com.songyan.getcontacts;import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.provider.ContactsContract;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.ArrayAdapter;import android.widget.ListView;import java.util.ArrayList;/** * 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; @Override 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方法 //分发给子视图
MyRelativeLayout dispatchTouchEvent return super方法 //分发给子视图之前看是否拦截
MyRelativeLayout onInterceptTouchEvent return super方法 //不拦截,分发给子视图处理
MyTextView dispatchTouchEvent return super方法 //调用当前视图的onTouch方法
MainActivity: MyTextView onTouch return false //调用当前视图的onTouchEvent方法
MyTextView onTouchEvent return super方法)
对应log:
01-08 05:11:21.222 3994-3994/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
01-08 05:11:21.224 3994-3994/? E/MyRelativeLayout: dispatchTouchEvent ACTION_DOWN
01-08 05:11:21.224 3994-3994/? E/MyRelativeLayout: onInterceptTouchEvent ACTION_DOWN
01-08 05:11:21.224 3994-3994/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
01-08 05:11:21.224 3994-3994/? E/MainActivity: MyTextView onTouch ACTION_DOWN
01-08 05:11:21.224 3994-3994/? E/MyTextView: onTouchEvent ACTION_DOWN
01-08 05:11:21.323 3994-3994/? E/MainActivity: dispatchTouchEvent ACTION_UP
01-08 05:11:21.324 3994-3994/? E/MyTextView: dispatchTouchEvent ACTION_UP
01-08 05:11:21.324 3994-3994/? E/MainActivity: MyTextView onTouch ACTION_UP
01-08 05:11:21.324 3994-3994/? E/MyTextView: onTouchEvent ACTION_UP
01-08 05:11:21.327 3994-3994/? E/MainActivity: MyTextView onClick
2.MyRelativeLayout dispatchTouchEvent return true 其他同1
(事件被当前视图消费掉了,不再向子视图传递事件)
对应log:
01-08 05:39:22.833 4244-4244/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
01-08 05:39:22.833 4244-4244/? E/MyRelativeLayout: dispatchTouchEvent ACTION_DOWN
01-08 05:39:22.934 4244-4244/? E/MainActivity: dispatchTouchEvent ACTION_UP
3.MyRelativeLayout dispatchTouchEvent return false 其他同1
(当前视图不传递事件,也不处理,而是传给父视图的onTouchEvent处理)
对应log:
01-08 05:55:52.909 4426-4426/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
01-08 05:55:52.909 4426-4426/? E/MyRelativeLayout: dispatchTouchEvent ACTION_DOWN
01-08 05:55:52.910 4426-4426/? E/MainActivity: onTouchEvent ACTION_DOWN
01-08 05:55:52.968 4426-4426/? E/MainActivity: dispatchTouchEvent ACTION_UP
01-08 05:55:52.968 4426-4426/? E/MainActivity: onTouchEvent ACTION_UP
4.MyRelativeLayout onInterceptTouchEvent return true 其他同1
(当前视图拦截事件,事件被传递到当前视图的onTouchEvent,onTouchEvent通过调用super方法
将事件传递给父视图的onTouchEvent方法处理)
对应log:
01-08 06:02:19.722 4611-4611/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
01-08 06:02:19.724 4611-4611/? E/MyRelativeLayout: dispatchTouchEvent ACTION_DOWN
01-08 06:02:19.724 4611-4611/? E/MyRelativeLayout: onInterceptTouchEvent ACTION_DOWN
01-08 06:02:19.724 4611-4611/? E/MyRelativeLayout: onTouchEvent ACTION_DOWN
01-08 06:02:19.725 4611-4611/? E/MainActivity: onTouchEvent ACTION_DOWN
01-08 06:02:19.780 4611-4611/? E/MainActivity: dispatchTouchEvent ACTION_UP
01-08 06:02:19.781 4611-4611/? E/MainActivity: onTouchEvent ACTION_UP
5.MyRelativeLayout onInterceptTouchEvent return false 其他同1
(当前视图不拦截事件,继续分发给子视图)
对应log:
01-08 06:18:16.613 4774-4774/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
01-08 06:18:16.615 4774-4774/? E/MyRelativeLayout: dispatchTouchEvent ACTION_DOWN
01-08 06:18:16.615 4774-4774/? E/MyRelativeLayout: onInterceptTouchEvent ACTION_DOWN
01-08 06:18:16.616 4774-4774/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
01-08 06:18:16.616 4774-4774/? E/MainActivity: MyTextView onTouch ACTION_DOWN
01-08 06:18:16.616 4774-4774/? E/MyTextView: onTouchEvent ACTION_DOWN
01-08 06:18:16.714 4774-4774/? E/MainActivity: dispatchTouchEvent ACTION_UP
01-08 06:18:16.716 4774-4774/? E/MyTextView: dispatchTouchEvent ACTION_UP
01-08 06:18:16.716 4774-4774/? E/MainActivity: MyTextView onTouch ACTION_UP
01-08 06:18:16.716 4774-4774/? E/MyTextView: onTouchEvent ACTION_UP
01-08 06:18:16.718 4774-4774/? E/MainActivity: MyTextView onClick
6.MyRelativeLayout onTouchEvent return true
MyTextView onTouchEvent return false 其他同1
对应log:
01-08 08:47:20.171 5883-5883/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
01-08 08:47:20.177 5883-5883/? E/MyRelativeLayout: dispatchTouchEvent ACTION_DOWN
01-08 08:47:20.178 5883-5883/? E/MyRelativeLayout: onInterceptTouchEvent ACTION_DOWN
01-08 08:47:20.178 5883-5883/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
01-08 08:47:20.178 5883-5883/? E/MainActivity: MyTextView onTouch ACTION_DOWN
01-08 08:47:20.178 5883-5883/? E/MyTextView: onTouchEvent ACTION_DOWN
01-08 08:47:20.178 5883-5883/? E/MyRelativeLayout: onTouchEvent ACTION_DOWN
01-08 08:47:20.293 5883-5883/? E/MainActivity: dispatchTouchEvent ACTION_UP
7.MyRelativeLayout onTouchEvent return false
MyTextView onTouchEvent return false 其他同1
01-08 09:06:32.974 6082-6082/? E/MainActivity: dispatchTouchEvent ACTION_DOWN
01-08 09:06:32.976 6082-6082/? E/MyRelativeLayout: dispatchTouchEvent ACTION_DOWN
01-08 09:06:32.976 6082-6082/? E/MyRelativeLayout: onInterceptTouchEvent ACTION_DOWN
01-08 09:06:32.976 6082-6082/? E/MyTextView: dispatchTouchEvent ACTION_DOWN
01-08 09:06:32.977 6082-6082/? E/MainActivity: MyTextView onTouch ACTION_DOWN
01-08 09:06:32.977 6082-6082/? E/MyTextView: onTouchEvent ACTION_DOWN
01-08 09:06:32.977 6082-6082/? E/MyRelativeLayout: onTouchEvent ACTION_DOWN
01-08 09:06:32.977 6082-6082/? E/MainActivity: onTouchEvent ACTION_DOWN
阅读全文
0 0
- ViewGroup的事件传递机制
- ViewGroup事件传递机制
- ViewGroup事件传递机制
- 深入探索 ViewGroup 的事件传递机制
- Android ViewGroup事件传递机制
- Android事件传递机制以及ViewGroup的onInterceptTouchEvent的理解
- android viewgroup 的事件传递机制学习笔记
- Android ViewGroup 触摸事件传递机制
- Android ViewGroup 触摸事件传递机制
- ViewGroup的事件分发机制
- Android-ViewGroup的事件机制
- ViewGroup的事件分发机制
- ViewGroup的事件分发机制
- ViewGroup 的事件分发机制
- Android 的事件分发机制(二)---ViewGroup的事件传递
- Android中事件处理机制之——ViewGroup的事件传递详解(一)
- view传递事件的处理机制(自定义了viewGroup和LinearLayout做实验)
- Android ViewGroup和View的传递事件
- C# 4.0 之线程安全集合篇
- 此图片来自微信公众平台 未经允许不可引用
- word的api
- Memcache技术精华
- NVIDIA嵌入式开发板Jetson TX1教程
- ViewGroup的事件传递机制
- linux常用命令
- 让Kotlin一点点侵入你的Android工程
- keil 编译通过 链接错误 解决
- plsql 11g 注册码
- 一维权限数组生成树结构权限
- ALSA(高级Linux声音架构):一 简单例子
- linux 安装 mysql
- Java线程学习(一):线程并发和线程忙等待