事件传递,事件处理)
事件的传递:父View------>子View
事件的处理:子View------>父View
ViewGroup需要复写方法:
/**
* 分发事件
*/
public boolean
dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev)
;
}
/**
* 拦截事件
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
/**
* 处理事件
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
View需要复写方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.i("eventintercept","-----MyView dispatchTouchEvent()") ;
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i("eventintercept","-----MyView onTouchEvent()") ;
return super.onTouchEvent(event);
}
注
意:ViewGroup比View多一个
onInterceptTouchEvent()方法,什么事件的传递(分发)可以在ViewGroup阶段里拦截下来,使其不再往子View传递
onInterceptTouchEvent() 返回true:表示事件被拦截,不再往子View传递;交给自己处理,
会调用自己的onTouchEvent()来处理事件
(默认返回false)
onTouchEvent() 返回true :表示事件已经处理完毕,不再往上处理
返回false:表示事件未处理完毕,将继续交给上级处理 (默认返回false)
dispatchTouchEvent() :就直接return super.dispatchTouchEvent(event);
onInterceptTouchEvent()里写逻辑
代码举例:
ViewGroupA.java
public class ViewGroupA extends LinearLayout {
public ViewGroupA(Context context) {
super(context);
}
public ViewGroupA(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ViewGroupA(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 分发事件
*/
@Override
dispatchTouchEvent(MotionEvent ev) {
//这里写处理代码
//super.dispatchTouchEvent(ev) 里面会调用onInterceptTouchEvent()来检查是否需要拦截
//return super.dispatchTouchEvent(ev) 往往不动,一般在onInterceptTouchEvent()写相关拦截代码
return super.dispatchTouchEvent(ev);
}
/**
* 拦截事件
*/
@Override
onInterceptTouchEvent(MotionEvent ev) {
/ /在这里写相应的拦截代码,然后返回true,false
Log.i("eventintercept", "-----ViewGroupA onInterceptTouchEvent()") ;
//不必非要return super.onInterceptTouchEvent(ev)
return super.onInterceptTouchEvent(ev);
}
/**
* 处理事件
*/
@Override
onTouchEvent(MotionEvent event) {
Log.i("eventintercept", "-----ViewGroupA onTouchEvent()") ;
return super.onTouchEvent(event);
}
}
ViewGroupB.java
public class ViewGroupB extends LinearLayout {
public ViewGroupB(Context context) {
super(context);
}
public ViewGroupB(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ViewGroupB(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
dispatchTouchEvent(MotionEvent ev) {
//这里写处理代码
Log.i("eventintercept", "-----ViewGroupB dispatchTouchEvent()") ;
return super.dispatchTouchEvent(ev);
}
/**
* 拦截事件
*/
@Override
onInterceptTouchEvent(MotionEvent ev) {
//在这里写相应的拦截代码,然后返回true,false
Log.i("eventintercept", "-----ViewGroupB onInterceptTouchEvent()") ;
//不必非要return super.onInterceptTouchEvent(ev)
return super.onInterceptTouchEvent(ev);
}
/**
* 处理事件
*/
@Override
onTouchEvent(MotionEvent event) {
Log.i("eventintercept", "-----ViewGroupB onTouchEvent()") ;
return super.onTouchEvent(event);
}
}
MyView.java
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
dispatchTouchEvent(MotionEvent event) {
Log.i("eventintercept","-----MyView dispatchTouchEvent()") ;
return super.dispatchTouchEvent(event);
}
@Override
onTouchEvent(MotionEvent event) {
Log.i("eventintercept","-----MyView onTouchEvent()") ;
return super.onTouchEvent(event);
}
}
日志:
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----MyView dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----MyView onTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent()
事件传递:
------>ViewGroupA
dispatchTouchEvent()
onInterceptTouchEvent()
----->ViewGroupB
dispatchTouchEvent()
onInterceptTouchEvent()
----->MyView
dispatchTouchEvent()
事件处理:
----->MyView
onTouchEvent()
----->ViewGroupB
onTouchEvent()
------>ViewGroupA
onTouchEvent()
修改1:
ViewGroupB:
public boolean onInterceptTouchEvent(MotionEvent ev) {
//.....
return true ; //在 ViewGroupB中将事件拦截,不再往子View分发;事件的传递流程在此被截断
}
日志:
=com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent() //事件在这里被拦截
onTouchEvent() //事件就直接在B中被处理了
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent() //将处理的事件继续交给上级A
修改2:
MyView
onTouchEvent(MotionEvent event) {
//.....
return true; //事件在MyView 中被处理后,不再交给上级继续处理,事件的处理流程在此被截断
}
日志:
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----MyView dispatchTouchEvent()
onTouchEvent()
//处理流程在这里被截断
事件传递,事件处理)
事件的传递:父View------>子View
事件的处理:子View------>父View
ViewGroup需要复写方法:
/**
* 分发事件
*/
public boolean
dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev)
;
}
/**
* 拦截事件
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
/**
* 处理事件
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
View需要复写方法:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.i("eventintercept","-----MyView dispatchTouchEvent()") ;
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.i("eventintercept","-----MyView onTouchEvent()") ;
return super.onTouchEvent(event);
}
注 意:ViewGroup比View多一个
onInterceptTouchEvent()方法,什么事件的传递(分发)可以在ViewGroup阶段里拦截下来,使其不再往子View传递
onInterceptTouchEvent() 返回true:表示事件被拦截,不再往子View传递;交给自己处理,
会调用自己的onTouchEvent()来处理事件
(默认返回false)
onTouchEvent() 返回true :表示事件已经处理完毕,不再往上处理
返回false:表示事件未处理完毕,将继续交给上级处理 (默认返回false)
dispatchTouchEvent() :就直接return super.dispatchTouchEvent(event);
onInterceptTouchEvent()里写逻辑
代码举例:
ViewGroupA.java
public class ViewGroupA extends LinearLayout {
public ViewGroupA(Context context) {
super(context);
}
public ViewGroupA(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ViewGroupA(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 分发事件
*/
@Override
dispatchTouchEvent(MotionEvent ev) {
//这里写处理代码
//super.dispatchTouchEvent(ev) 里面会调用onInterceptTouchEvent()来检查是否需要拦截
//return super.dispatchTouchEvent(ev) 往往不动,一般在onInterceptTouchEvent()写相关拦截代码
return super.dispatchTouchEvent(ev);
}
/**
* 拦截事件
*/
@Override
onInterceptTouchEvent(MotionEvent ev) {
/ /在这里写相应的拦截代码,然后返回true,false
Log.i("eventintercept", "-----ViewGroupA onInterceptTouchEvent()") ;
//不必非要return super.onInterceptTouchEvent(ev)
return super.onInterceptTouchEvent(ev);
}
/**
* 处理事件
*/
@Override
onTouchEvent(MotionEvent event) {
Log.i("eventintercept", "-----ViewGroupA onTouchEvent()") ;
return super.onTouchEvent(event);
}
}
ViewGroupB.java
public class ViewGroupB extends LinearLayout {
public ViewGroupB(Context context) {
super(context);
}
public ViewGroupB(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ViewGroupB(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
dispatchTouchEvent(MotionEvent ev) {
//这里写处理代码
Log.i("eventintercept", "-----ViewGroupB dispatchTouchEvent()") ;
return super.dispatchTouchEvent(ev);
}
/**
* 拦截事件
*/
@Override
onInterceptTouchEvent(MotionEvent ev) {
//在这里写相应的拦截代码,然后返回true,false
Log.i("eventintercept", "-----ViewGroupB onInterceptTouchEvent()") ;
//不必非要return super.onInterceptTouchEvent(ev)
return super.onInterceptTouchEvent(ev);
}
/**
* 处理事件
*/
@Override
onTouchEvent(MotionEvent event) {
Log.i("eventintercept", "-----ViewGroupB onTouchEvent()") ;
return super.onTouchEvent(event);
}
}
MyView.java
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
dispatchTouchEvent(MotionEvent event) {
Log.i("eventintercept","-----MyView dispatchTouchEvent()") ;
return super.dispatchTouchEvent(event);
}
@Override
onTouchEvent(MotionEvent event) {
Log.i("eventintercept","-----MyView onTouchEvent()") ;
return super.onTouchEvent(event);
}
}
日志:
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----MyView dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----MyView onTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent()
事件传递:
------>ViewGroupA
dispatchTouchEvent()
onInterceptTouchEvent()
----->ViewGroupB
dispatchTouchEvent()
onInterceptTouchEvent()
----->MyView
dispatchTouchEvent()
事件处理:
----->MyView
onTouchEvent()
----->ViewGroupB
onTouchEvent()
------>ViewGroupA
onTouchEvent()
修改1:
ViewGroupB:
public boolean onInterceptTouchEvent(MotionEvent ev) {
//.....
return true ; //在 ViewGroupB中将事件拦截,不再往子View分发;事件的传递流程在此被截断
}
日志:
=com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent() //事件在这里被拦截
onTouchEvent() //事件就直接在B中被处理了
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onTouchEvent() //将处理的事件继续交给上级A
修改2:
MyView
onTouchEvent(MotionEvent event) {
//.....
return true; //事件在MyView 中被处理后,不再交给上级继续处理,事件的处理流程在此被截断
}
日志:
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupA onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB dispatchTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----ViewGroupB onInterceptTouchEvent()
com.wzh.eventintercepttest I/eventintercept﹕ -----MyView dispatchTouchEvent()
onTouchEvent()
//处理流程在这里被截断