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

原创粉丝点击