这里继续对android的事件机制和事件监听进行总结,并在以后的实践中不断总结:
Event Listeners 事件监听器
Event Handlers 事件处理器
Touch Mode 触摸模式
Handling Focus 处理焦点
Event Handlers:
如果您建立一个继承于View自定义组件,然后您可以定义一些回调方法用作默认的事件处理程序,。您会学习一些共用的回调方法用于事件处理,其中包括:
• onKeyDown(int, KeyEvent) - -当一个按键被按下时被调用
• onKeyUp(int, KeyEvent)-当一个按键弹起时被调用
• onTrackballEvent(MotionEvent)- 轨迹球被触动时调用
• onTouchEvent(MotionEvent) - 当试图得到或失去高亮时.
还有其他一些方法,这不属于View类,但可以直接影响到你处理事件的方式,所以在布局内管理更复杂的
事件们可以考虑到这些方法:
• Activity.dispatchTouchEvent(MotionEvent)它是让你的Activity 去拦截所有的事件,在它们被传送到具体窗口之前public boolean dispatchKeyEvent(KeyEvent event) { // 点击键即可触发此方法,在onKeyDown,onKeyUp前 switch (event.getKeyCode()) { case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: Log.v(TAG, "KEYCODE_VOLUME_UP/KEYCODE_VOLUME_DOWN"); // TODO return true; // 不接受往下传,到此结束 case KeyEvent.KEYCODE_BACK: Log.v(TAG, "KEYCODE_BACK"); // TODO return false; // 接受往下传,接着执行父类的这个事件 } return false; // 将其他键往下传 } public boolean onKeyUp(int keyCode, KeyEvent event) { // 键松开时执行 Log.v(TAG, "onKeyUp"); return super.onKeyUp(keyCode, event); } public boolean onKeyDown(int keyCode, KeyEvent event) { // 键按下时执行 Log.v(TAG, "onKeyDown - keyCode"); return super.onKeyDown(keyCode, event); }
• ViewGroup.onInterceptTouchEvent(MotionEvent)这个方法让ViewGroup去查看事件,并由他来传递到具体的子窗口
• ViewParent.requestDisallowInterceptTouchEvent(boolean)子窗口通过这个方法告诉父窗口,不容许父窗口使用onInterceptTouchEvent(MotionEvent). 去拦截触摸事件
系统框架将处理日常的焦点移动来响应用户的输入,它包刮改变焦点(当界面是被移除,隐藏,或者作为一个新的View变为可用状态),通过isFocusable()这个方法我们可以知道view是否具有接受焦点的资格,也可以通过setFocusable().来设置view接受焦点的资格,对应在触摸模式下,你可以调用isFocusableInTouchMode().来获知是否有焦点来响应点触,也可以通
过setFocusableInTouchMode().来设置是否有焦点来响应点触的资格。
系统框架控制焦点移动到另一个组建的算法是在某一方向上邻近的组件,在极个别情况下,默认的算法可
能不符合开发者的预想要求,在这种情况下,你可以覆写下列XML属性的布局文件: nextFocusDown ,nextFocusLeft , nextFocusRight ,和nextFocusUp 设置他们的值来明确焦点从当前界面移动下个界面的Id
例如:
<LinearLayout android:orientation="vertical" ... > <Button android:id="@+id/top" android:nextFocusUp="@+id/bottom" ... /> <Button android:id="@+id/bottom" android:nextFocusDown="@+id/top" ... /> </LinearLayout>
一般来说,在这个垂直布局,浏览的焦点会从第一个按钮开始,不会是从第二个或者其他的,现在top
Buttont已经通过nextFocusUp (反之亦然)确定了bottom
通常如果你想宣布用户界面具有焦点的资格(如果这个界面在传统上是没有的),可以在xml布局里去加
上的android:focusable的属性,并设置它的值,您也可以宣布在触摸模式下具有焦点的资格,同样也只
在xml里添android:focusableInTouchMode.的属性,并设置它的值
当用户请求在某个界面聚集焦点时,会调用requestFocus().这个方法监听到焦点活动(获得焦点或失去焦点都会被通知),会调用onFocusChange(),这个方法,这也是上节
所讨论的Event Listeners节段
相关资料也可以参考本博客文章:《Android onTouchEvent, onClick及onLongClick的调用机制 》
http://blog.csdn.net/xiai_fei/article/details/6324804
参考:【eoeAndroid特刊】第二期: 图像处理篇(1),发布版本: Ver 1.0.0(build 2009.05.20)
由eoeAndroid社区组织策划,整理及发布,版权所有,转载请保留!