Android事件和监听器

        Android中的事件按类型可以分为:按键事件和屏幕触摸事件。在MVC模型中,控制器根据界面事件(UI Event)类型不同,将事件传递给界面控件不同的事件处理函数。

按键事件(KeyEvent):将传递给onKey()函数进行处理

触摸事件(TouchEvent):将传递给onTouch()函数进行处理


Android系统界面事件的传递和处理遵循的规则:


1、如果界面控件设置了事件监听器,则事件将先传递给事件监听器
2、如果界面控件没有设置事件监听器,界面事件则会直接传递给界面控件的其他
事件处理函数
3、即使界面控件设置了事件监听器,界面事件也可以再次传递给其他事件处理函数
是否继续传递事件给其他处理函数是由事件监听器处理函数的返回值决定的
4、如果监听器处理函数的返回值为true,表示该事件已经完成处理过程,不需要其他处理函数参与处理过程,这样事件就不会再继续进行传递
5、如果监听器处理函数的返回值为false,则表示该事件没有完成处理过程,或需要其他处理函数捕获到该事件,事件会被传递给其他的事件处理函数


Android事件处理机制 :

        按Android事件类别的处理可分为:Android按键事件处理和屏幕触摸处理两类;不论是按键事件还是屏幕触摸处理,它们的Android的事件处理模型都分为:基于监听接口的事件处理和基于回调机制的事件处理两类。此外,还有Handler消息传递机制,用于解决Android系统平台不允许新启动的线程访问该Activity里面的界面组件Widget问题,用户使用Handler可以完成Activity的界面组件与应用程序中线程之间的交互。

1、Android按键事件处理
     
Android按键事件处理主要着重于View和Activity两个级别。 按键事件的处理如下:
1)默认情况下,如果没有View获得焦点,事件将传递给Activity处理。
2)如果View获得焦点,事件首先传递到View的回调方法中。View回调方法返回false,事件继续传递到Activity处理。反之,事件不会继续传递。
使用View.SetFocusable(true)设置可以获得焦点。
public boolean onKeyDown(int keyCode, KeyEvent msg) 来处理键盘按下事件
public boolean onKeyUp(int keyCode, KeyEvent msg) 来处理键盘抬起事件


下面就Android按键事件的监听及信息传递给处理函数举例如下:
为了处理Android控件的按键事件,先需要设置按键事件的监听器,并重载onKey()函数
 
entryText.setOnKeyListener(new OnKeyListener(){
@Override
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
//过程代码……
return true/false;
}

第1行代码是设置控件的按键事件监听器
第3行代码的onKey ()函数中的参数
第1个参数view表示产生按键事件的界面控件
第2个参数keyCode表示按键代码
第3个参数keyEvent则包含了事件的详细信息,如按键的重复次数、硬件编码和按键标志等
第5行代码是onKey ()函数的返回值
返回true,阻止事件传递
返回false,允许继续传递按键事件


2、Android屏幕触摸事件处理:
       在Android系统中,Touch事件是屏幕触摸事件的基础事件。对于多层用户界面(UI)嵌套情况,如果用户点击的UI部分没有重叠,只是属于单独的某个UI(如点击父View没有重叠的部分) ,那么只有这个单独的UI能够捕获到touch事件。如果用户点击了UI重叠的部分,首先捕获到touch事件的是父类View,然后再根据特定方法的返回值,决定touch事件的处理者。


在Android系统中,每个View的子类都有三个和TouchEvent 处理密切相关的方法,它们分别是:
1)public boolean dispatchTouchEvent(MotionEvent ev) ;//这个方法用来分发 TouchEvent 
2)public boolean onInterceptTouchEvent(MotionEvent ev); //这个方法用来拦截 TouchEvent 
3)public boolean onTouchEvent(MotionEvent ev) ;// 这个方法用来处理 TouchEvent

其中onTouchEvent方法定义在View类中,当touch事件发生,首先传递到该View,由该View处理时,该方法将会被执行。
dispatchTouchEventonInterceptTouchEvnet这两个方法定义在ViewGroup中,因为只有ViewGroup才会包含子View和子ViewGroup,才需要在UI多层嵌套时,通过上述的两个方法去决定是否监听处理连续touch动作和touch动作由谁去截获处理。

事件处理流程

1、基于回调机制的事件处理
Android提供了onKeyDown、onKeyUp、onTouchEvent、onTrackBallEvent、onFocusChanged等回调方法供用户使用。
1)onKeyDown:该方法是接口KeyEvent.Callback中的抽象方法,所有的View全部实现了该接口并重写了该方法,该方法用来捕捉手机键盘被按下的事件。
2)onKeyUp:该方法也是接口KeyEvent.Callback中的一个抽象方法,并且所有的View同样全部实现了该接口并重写了该方法,onKeyUp方法用来捕捉手机键盘按键抬起的事件。
3)onTouchEvent:该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。
4)onTrackBallEvent:是手机中轨迹球的处理方法onTrackBallEvent。所有的View同样全部实现了该方法。
5) onFocusChanged:该方法是焦点改变的回调方法,当某个控件重写了该方法后,当焦点发生变化时,会自动调用该方法来处理焦点改变的事件。


2、基于监听接口的事件处理
Android提供的基于事件监听接口有OnClickListener、OnLongClickListener、OnFocusChangeListener、OnKeyListener、OnTouchListener、OnCreateContextMenuListener等。
1)OnClickListener接口:该接口处理的是点击事件。在触摸模式下,是在某个View上按下并抬起的组合动作,而在键盘模式下,是某个View获得焦点后点击确定键或者按下轨迹球事件。
2)OnLongClickListener接口: OnLongClickListener接口与上述的OnClickListener接口原理基本相同,只是该接口为View长按事件的捕捉接口,即当长时间按下某个View时触发的事件。
3)OnFocusChangeListener接口:OnFocusChangeListener接口用来处理控件焦点发生改变的事件。如果注册了该接口,当某个控件失去焦点或者获得焦点时都会触发该接口中的回调方法。
4)OnKeyListener接口:是对手机键盘进行监听的接口,通过对某个View注册并监听,当View获得焦点并有键盘事件时,便会触发该接口中的回调方法。
5)OnTouchListener接口:是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。
6)OnCreateContextMenuListener接口:是用来处理上下文菜单显示事件的监听接口。该方法是定义和注册上下文菜单的另一种方式。



更多相关文章

  1. android 4.2.2提示 unauthorized终极解决办法,很粗暴
  2. Android(安卓)ADB超简单的安装方法
  3. Android(安卓)UI开发详解之Fragment
  4. Android(安卓)开发之多线程处理、Handler 详解
  5. [置顶] Android(安卓)AsyncTask源码解析
  6. 选项菜单_上下文菜单_子菜单_图标菜单_自定义菜单_联系人标记弹
  7. 站在大神肩膀上,深入理解 Android事件分发机制
  8. Android(安卓)Retrofit 2.0(三)从源码分析原理
  9. Android中使用4种方式实现按钮点击操作

随机推荐

  1. 在android 中调用其他的功能
  2. Android Studio 配置输出apk的名字
  3. android fragment 面试
  4. android通过图片名称获取资源识别码
  5. android中使用static、application、本地
  6. Android G711A编解码
  7. android银行卡操作步骤
  8. ANDROID音频系统散记之四:4.0音频系统HAL
  9. 常用adb命令
  10. Android - 详情页面【仿】淘宝App