android事件机制

来源:互联网 发布:网络数据流量检测工具 编辑:程序博客网 时间:2024/06/03 12:12

在android下,事件的发生是在监听器下进行,android系统可以响应按键事件和触摸屏事件,事件说明如下:

     onClick(View v)一个普通的点击长按按钮事件

     onLongClick(View v)一个普通的点击长按按钮事件

     boolean onKeyMultiple(int keyCode,int repeatCount,keyEvent event)多个事件连续发生时,用于按键重复,必需重载@override实现

     boolean onKeyDown(int keyCode,KeyEvent event)用于按键进行按下时发生

     boolean onKeyUp(int keyCode,KeyEvent event)用于按键进行释放时发生

     boolean onKeyLongPress(int keyCode,KeyEvent event)当你长时间按时发生

     onTouchEvent(MotionEvent event)触摸屏事件,当你触摸屏幕时发生

     boolean dispatchTouchEvent(MotionEvent event)触控时负责事件传递,必需重载@override实现(view和activity都可以进行分发)

     boolean onInterceptTouchEvent(MotionEvent event)触控时负责事件拦截

     我们先大致了解下android事件机制,安卓事件机制主要包含事件的拦截,传递(分发),响应(消费)。在翻阅了很多文章后,在结合谷歌官方文章总结出,安卓每个事件都会进行以上三个过程。那么接下来我们先开始理解下事件的整个过程。

     (1)Event事件的拦截

        onInterceptTouchEvent(),安卓中此事件负责拦截一个用户产生的点击或者触摸事件,主要起终止传递作用,当用户点触摸产生一个事件时,由上层(view,activity)传入事件时,此方法负责拦截,拦截后将交由本控件去消费当前事件,如果无需拦截,则继续交由下层的view去自己传递和分发。具体如下:

        如果返回ture,则代表拦截此事件,那么事件就不会往子控件进行传递,由当前view进行调用onTouchEvent()来响应该事件,反之返回false不拦截,事件将继续传递,则由子view去调用自己的dispatchTouchEvent()去分发,最后由具体的控件去消费此事件。

       注意:很多书中和博客中忽视了一点,当然onInterceptHoverEvent()也拥有拦截权利,但是它和OnInterceptTouchEvent()有细微区别,此方法主要处理滑动事件,通俗讲就是当产生有位移的事件时触发此方法。

     (2)Event事件的传递

       dispatchEvent(MotionEvent event)负责事件的调度,很多人称之为分发和传递一个意思,其主要负责将事件交由哪个控件去处理,如果自己不想处理,则可以继续往下传递,想处理则触发本身view的ontuchEvent().

       此方法也返回boolean类型,返回ture代表传递,返回false代表不传递,和我们的事件拦截恰恰相反,对于初学者来说很容易搞糊涂,本事件Activty,ViewGroup,View都拥有处理权,主要将事件负责转发,无论交由别人处理还是自己,其实都在充当调度角色,是事件的核心。

 (3)Event事件响应

  安卓中事件具体处理交由onTouchEvent()来执行,此阶段主要负责事件的消费响应,通过处理完事件后,然后逐步向上级汇报,如果消费了上次则不会再进行做响应消费处理,只会继续返回给根布局。

  此方法返回布尔类型,如果消费了此事件,则会调用上级的此方法,默认返回false做处理,如果返回true,则代表不消费此事件,让上级调用本方法去做处理,逐步往上汇报,知道activity得到消息为止。

  MotionEvent事件

  (1)主要的事件类型有:

  ACTION_DOWN:表示用户开始触摸.

       ACTION_MOVE:表示用户在移动(手指或者其他)

       ACTION_UP:表示用户抬起了手指 

       ACTION_CANCEL:表示手势被取消

  还有一个不常见的:ACTION_OUTSIDE:表示用户触碰超出了正常的ui边界。但是对于多点触控的支持,android加入了以下一些事件类型来处理如:

       ACTION_POINTER_DOWN:有一个非主要的手指按下了

       ACTION_POINTER_UP:一个非主要的手指抬起来了

 (2)事件发生的位置,x,y轴

  getx()获得事件发生时,触摸的中间区域在屏幕的x轴。

  gety()获得事件发生时,触摸的中间区域在屏幕的y轴。

  在多点触控中还可以通过:

  getX(intpointerIndex) ,来获得对应手指事件的发生位置.获得Y轴用getY(intpointerIndex)

    (3)其他属性

      getEdgeFlags():当事件类型是ActionDown时可以通过此方法获得,手指触控开始的边界,如果是的话,有如下几种值:EDGE_LEFT,EDGE_TOP,EDGE_RIGHT,EDGE_BOTTOM

      KeyEvent事件

  (1)keyevent包括以下类型:

         KeyEvent.KEYCODE_DPAD_UP;
   
KeyEvent.KEYCODE_DPAD_DOWN;
   
KeyEvent.KEYCODE_DPAD_LEFT;
   
KeyEvent.KEYCODE_DPAD_RIGHT;
   
KeyEvent.KEYCODE_DPAD_CENTER;确定键

           KeyEvent.KEYCODE_DPAD_RIGHT;

           KeyEvent.KEYCODE_XXX:数字键(xx表示你按了数字几)

           KeyEvent.KEYCODE_BACK;返回键
   
KeyEvent.KEYCODE_HOME;房子键

  (2)dispatchKeyEvent

   在了解这个之前,先熟悉下dispatchKeyEvent、onkeydown、onkeyup的关系,当键盘按下时首先触发dispatchKeyEvent,然后触发onUserInteraction再次onkeyDown如果按下紧接着松开,则是两步,紧跟着触发dispatchKeyEvent然后触发onUserInteraction再次onkeyUp。


1 0
原创粉丝点击