基于监听
基于监听的事件由三个元素:事件源,事件,事件监听器。
一般类型有:
- OnClickListener 单击事件监听器。
- FocusChangedListener 焦点改变的事件监听器。
- OnKeyListener 按键事件监听器
- ……
使用方法也比较简单:
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//直接设置监听器 并重写方法 和 逻辑代码
}
});
基于回调
基于回调的函数基本都有返回类型。如果本层处理最后返回true,继续传递则返回false。
- public boolean dispatchTouchEvent()事件的分发。
return true : View消费所有事件。
return false :停止分发,交由上层控件的onTouchEvent方法进行消费,如果本层控件是Activity,那么事件将被系统消费、处理。
super.dispatchTouchEvent(ev): 将事件交由本层的事件拦截onInterceptTouchEvent方法处理。
public boolean onInterceptTouchEvent(MotionEvent ev) 事件拦截
return true;对事件拦截,交由本层的onTouchEvent进行处理。 return false;不拦截,分发到子View,由子View的dispatchTouchEvent方法处理。 super.onInterceptTouchEvent(ev):默认表示事件拦截,交由本层的onTouchEvent进行处理。
public boolean onTouchEvent(MotionEvent ev)
return true: 表示onTouchEvent处理完事件后消费了此次事件。 return false: 不响应事件,不断的传递给上层的onTouchEvent方法处理,直到某个View的onTouchEvent返回true,则认为该事件被消费。如果到最顶层View还是返回false,那么该事件不消费,将交由Activity的onTouchEvent进行处理。 return: super.onTouchEvent,不响应事件,结果与return返回false一样。
mButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.d("TAG", "ACTION_DOWN " );
break;
case MotionEvent.ACTION_MOVE:
Log.d("TAG", "ACTION_MOVE " );
break;
case MotionEvent.ACTION_CANCEL:
Log.d("TAG", "ACTION_CANCEL " );
break;
case MotionEvent.ACTION_UP:
Log.d("TAG", "ACTION_UP " );
break;
}
return false;
}
});
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG", "CLCIK " );
}
});
D/TAG: ACTION_DOWN
D/TAG: ACTION_MOVE
D/TAG: ACTION_MOVE
D/TAG: ACTION_UP
D/TAG: CLCIK
一个简单的按钮点击,按照上面代码,事件顺序是按下–>移动–>抬起–>点击。但是如果move的时候超过Button的范围,或者把onTouch的返回值改成true,那么久不会触发click事件了。一个完整事件就是由分发–>事件拦截–>找到事件的消费者–>完成事件。
想了解更多推荐:
http://blog.csdn.net/guolin_blog/article/details/9097463
http://blog.csdn.net/guolin_blog/article/details/9153761
MARK(10)
载营魄抱一,能无离乎?专气致柔,能如婴儿乎?涤除玄览,能无疵乎?爱国治民,能无为乎?天门开阖,能为雌乎?明白四达,能无知乎。