安卓事件处理

基于监听

基于监听的事件由三个元素:事件源,事件,事件监听器。
一般类型有:
- 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)

载营魄抱一,能无离乎?专气致柔,能如婴儿乎?涤除玄览,能无疵乎?爱国治民,能无为乎?天门开阖,能为雌乎?明白四达,能无知乎。

猜你喜欢

转载自blog.csdn.net/joy_chow/article/details/80924200