在gridview点击事件之后,打log看了下,
看到gridview的onclick事件响应的竟然排在onkeyup之后,这造成100~200ms的延迟啊,
后来换了在其它响应事件里面截取,但是在onkeydown不行,因为在onkeydown截取不了onkeyup的消息。
要在dispatchKeyEvent这个方法里面截取。
只有这样才不会继续把消息往onkeydown onkeyup 上传。因为dispatchKeyEvent是负责分发事件的方法。
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getAction()== KeyEvent.ACTION_DOWN){
if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER
|| event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) {
Log.i(TAG,"holder.listView.isFocusable() :"+holder.listView.isFocusable());
Log.i(TAG,"holder.gridView.isFocusable() :"+holder.gridView.isFocusable());
Log.i(TAG,"holder.btnSwitch.isFocusable() :"+holder.btnSwitch.isFocusable());
if (holder.btnSwitch.isFocusable() == true) {
return super.dispatchKeyEvent(event);
}
if (holder.listView.isFocusable() || holder.gridView.isFocusable()) {
dispatchKeyEvent(KeyEvent.KEYCODE_ENTER, mItemSelectedPosition);
return true;
}
}
}
return super.dispatchKeyEvent(event);
}
其实这里涉及到Android事件分发的原理
第一部分关于view的事件分发机制比较好理解一些,viewgroup的看得有点头大。
第一部分的核心就是dispatchKeyEvent.事件分发的源头,点击一个控件,这个view会有几个监听事件按照顺序的来触发,如果某个事件被某个监听事件吃掉了,
就不会被其他监听事件所收到。
而在我们这里为什么拦截onkeydown的事件阻止不了OnkeyUp,应该是这个事件分发的机制是肯定都要走过Onkeydown,onkeyUp吧。
但是在某个view拦截Onkeydown,肯定会拦截了其子view的OnkeyDown的事件。
所以只能在这里只能在事件分发的源头动手QAQ 。。。
参考博客:http://www.cnblogs.com/duoduohuakai/p/3996385.html
http://blog.csdn.net/pi9nc/article/details/9281829