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

原创粉丝点击