本篇博客主要的研究内容主要解决基于使用键盘上下左右键时,无法触发百度地图的MoveFinished的事件的问题。百度地图查询视野范围内的建筑物参看博客http://blog.csdn.net/fengshuiyue/article/details/9155463。
- android手机按键事件消息传递过程
- 只有一个Activity时:一次拇指点击事件(包括ACTION_DOWN,ACTION_UP),调用时序如下:
dispatchTouchEvent
onUserInteraction
onTouchEvent (ACTION_DOWN)
dispatchTouchEvent
onTouchEvent (ACTION_UP,不会触发onUserInteraction)
- 只有一个Activity,当键盘键按下时,时序如下:
dispatchKeyEvent
onUserInteraction
onKeyDown
dispatchKeyEvent
onUserInteraction
onKeyUp (注意与触摸不同,当松开按键时onUserInteraction也会触发。)
- Activity里有一个Layout,在Layout里有个按钮。一次拇指触摸点击事件(包括ACTION_DOWN,ACTION_UP),方法逻辑顺序如下:
Activity的dispatchTouchEvent
Activity的onUserInteraction
Layout的dispatchTouchEvent
Layout的onInterceptTouchEvent
Button的onTouchEvent(ACTION_DOWN)
紧跟着是一个ACTION_UP事件
Activity的dispatchTouchEvent(不触发Activity的onUserInteraction,它对ACTION_UP不起作用。)
Layout的dispatchTouchEvent
Layout的onInterceptTouchEvent
Button的onTouchEvent
Button的onClick
VIEW和Activity本身都有相应键盘事件的ONKEYUP和ONKEYDOWN。对于VIEW,可以setOnKeyListener监听键盘事件,如果既对VIEW写了上述侦听,又覆写了ONKEYUP,DOWN事件,那么首先进入ONKEYDOWN,ONKEYUP。
上述只要有一个函数中返回true,则相应到当前函数位置,不在继续传递。
- 地图工程对于上下左右键的处理
- 思路:在activity方法中,复写dispatchKeyEvent方法
- 代码
public boolean dispatchKeyEvent (KeyEvent event){ Log.e(TAG,"dispatchKeyEvent"); if((event.getKeyCode() ==KeyEvent.KEYCODE_DPAD_LEFT ||event.getKeyCode()==KeyEvent.KEYCODE_DPAD_RIGHT ||event.getKeyCode()==KeyEvent.KEYCODE_DPAD_UP ||event.getKeyCode()==KeyEvent.KEYCODE_DPAD_DOWN) &&level == LEVEL_MAP){ Log.e(TAG,"dispatchKeyEvent return true"); boolean flag = mMapView.dispatchKeyEvent(event); if(flag){ BsnsDisAllActivity.this.getBsnsDisInfo(BsnsDisAllActivity.this.getGeoPointMap()); } Log.e(TAG,"mMapView dispathKeyEvent:"+flag); return flag; } return super.dispatchKeyEvent(event); }
- 疑问
- 百度地图是如何早于activity的onKeydown事件捕获到上下左右键的按键信息?
- 百度地图在相应上下左右键按键信息后,没有触发MoveFinished事件。

本文探讨了在Android应用中,如何处理键盘事件与百度地图内部事件之间的冲突,特别是如何在使用键盘上下左右键时,避免触发百度地图的MoveFinished事件,同时保持应用的正常交互体验。

被折叠的 条评论
为什么被折叠?



