Android事件传递

来源:互联网 发布:mac颜色配置文件 编辑:程序博客网 时间:2024/04/20 01:32

自定义View跟Touch事件有关的处理方法主要由三个:

  事件从 Activity的dispatchTouchEvent函数开始传递

 public boolean dispatchTouchEvent(MotionEvent ev) 

   ViewGroup拦截事件

 public boolean onInterceptTouchEvent(MotionEvent ev)

  View事件处理,返回true事件将终止往下传递,以后的UP、DOWN事件都将交由该类处理;返回false事件继续往下传递给其子view

 public boolean onTouchEvent(MotionEvent event)
public class MyViewGroup extends ViewGroup {    public MyViewGroup(Context context) {        this(context, null);    }    public MyViewGroup(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init(context);    }    private void init(Context context) {        setBackgroundColor(0xFFFF0000);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        switch (ev.getAction()) {            case MotionEvent.ACTION_DOWN:                Log.i("hfz", "onInterceptTouchEvent ACTION_DOWN:MyViewGroup");                break;            case MotionEvent.ACTION_MOVE:                Log.i("hfz", "onInterceptTouchEvent ACTION_MOVE:MyViewGroup");                break;            case MotionEvent.ACTION_UP:                Log.i("hfz", "onInterceptTouchEvent ACTION_UP:MyViewGroup");                break;        }        return super.onInterceptTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                Log.i("hfz", "onTouchEvent ACTION_DOWN:MyViewGroup");                break;            case MotionEvent.ACTION_MOVE:                Log.i("hfz", "onTouchEvent ACTION_MOVE:MyViewGroup");                break;            case MotionEvent.ACTION_UP:                Log.i("hfz", "onTouchEvent ACTION_UP:MyViewGroup");                break;        }        return super.onTouchEvent(event);    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {    }}
public class ViewGroupActivity extends Activity{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_viewgroup);    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        switch (ev.getAction()){            case MotionEvent.ACTION_DOWN:                Log.i("hfz", "dispatchTouchEvent ACTION_DOWN:ViewGroupActivity");                break;            case MotionEvent.ACTION_MOVE:                Log.i("hfz","dispatchTouchEvent ACTION_MOVE:ViewGroupActivity");                break;            case MotionEvent.ACTION_UP:                Log.i("hfz","dispatchTouchEvent ACTION_UP:ViewGroupActivity");                break;        }        return super.dispatchTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                Log.i("hfz", "onTouchEvent ACTION_DOWN:ViewGroupActivity");                break;            case MotionEvent.ACTION_MOVE:                Log.i("hfz","onTouchEvent ACTION_MOVE:ViewGroupActivity");                break;            case MotionEvent.ACTION_UP:                Log.i("hfz","onTouchEvent ACTION_UP:ViewGroupActivity");                break;        }        return super.onTouchEvent(event);    }}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <com.event.MyViewGroup        android:layout_width="300dp"        android:layout_height="300dp"        android:background="#FF0000" />    <com.event.MyViewGroup1        android:layout_width="200dp"        android:layout_height="200dp"        android:background="#FFFF00" />    <com.event.MyViewGroup2        android:layout_width="100dp"        android:layout_height="100dp"        android:background="#00FF00" /></RelativeLayout>

  view和viewgroup都没有处理事件interceptTouch(return false或true)和onTouch(return false)的情况,后续的MOVE,UP事件将由Activity的onTouchEvent 处理

dispatchTouchEvent ACTION_DOWN:ViewGroupActivityonInterceptTouchEvent ACTION_DOWN:MyViewGroup2onTouchEvent ACTION_DOWN:MyViewGroup2onInterceptTouchEvent ACTION_DOWN:MyViewGroup1onTouchEvent ACTION_DOWN:MyViewGroup1onInterceptTouchEvent ACTION_DOWN:MyViewGrouponTouchEvent ACTION_DOWN:MyViewGrouponTouchEvent ACTION_DOWN:ViewGroupActivitydispatchTouchEvent ACTION_MOVE:ViewGroupActivityonTouchEvent ACTION_MOVE:ViewGroupActivitydispatchTouchEvent ACTION_MOVE:ViewGroupActivityonTouchEvent ACTION_MOVE:ViewGroupActivitydispatchTouchEvent ACTION_UP:ViewGroupActivityonTouchEvent ACTION_UP:ViewGroupActivity

  MyViewGroup1处理事件interceptTouch(return false或true)和onTouch(return true)的情况,后续的MOVE,UP事件将由MyViewGroup1的onTouchEvent 处理,同时MyViewGroup将收不到事件

dispatchTouchEvent ACTION_DOWN:ViewGroupActivityonInterceptTouchEvent ACTION_DOWN:MyViewGroup2onTouchEvent ACTION_DOWN:MyViewGroup2onInterceptTouchEvent ACTION_DOWN:MyViewGroup1onTouchEvent ACTION_DOWN:MyViewGroup1dispatchTouchEvent ACTION_MOVE:ViewGroupActivityonTouchEvent ACTION_MOVE:MyViewGroup1dispatchTouchEvent ACTION_MOVE:ViewGroupActivityonTouchEvent ACTION_MOVE:MyViewGroup1dispatchTouchEvent ACTION_MOVE:ViewGroupActivityonTouchEvent ACTION_MOVE:MyViewGroup1dispatchTouchEvent ACTION_MOVE:ViewGroupActivityonTouchEvent ACTION_MOVE:MyViewGroup1dispatchTouchEvent ACTION_UP:ViewGroupActivityonTouchEvent ACTION_UP:MyViewGroup1
0 0
原创粉丝点击