Android 5.0下SlidingMenu和Cocos2dx一起使用引起的一个奇怪的绘制bug的解决办法

来源:互联网 发布:安卓windows双系统手机 编辑:程序博客网 时间:2024/06/13 05:48

公司的用户认证SDK项目接了游戏工程在Android 5.0.1系统下测试时出现了一个bug:

使用了SlidingMenu的那个Activity的控件(包括Fragment里的和SlidingMenu里的),会出现问题。具体的表现为ListView的列表项和按钮等点击之后没有看到响应点击的背景色;EditText点击后没看到光标,输入一些字符串后没有显示在EditText里,但滑动一下SlidingMenu后就能显示出字符串了。

经过分析测试,这个bug只有在Android 5.0系统下,并且同时使用SlidingMenu和Cocos2dx的项目才会出现。这个项目在Android 5.0以下的系统运行正常,没有这个bug。而在Android 5.0系统环境,如果不接入Cocos2dx工程,只用SDK的demo跑也正常。

我本以为是焦点的获取问题,但通过Activity.getCurrentFocus()方法是有得到各个控件的焦点的,且点击的事件也有响应。于是去分析SlidingMenu的源码,发现是以下代码的问题。

@TargetApi(Build.VERSION_CODES.HONEYCOMB)public void manageLayers(float percentOpen) {if (Build.VERSION.SDK_INT < 11) return;boolean layer = percentOpen > 0.0f && percentOpen < 1.0f;final int layerType = layer ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE;if (layerType != getContent().getLayerType()) {mHandler.post(new Runnable() {public void run() {Log.v(TAG, "changing layerType. hardware? " + (layerType == View.LAYER_TYPE_HARDWARE));getContent().setLayerType(layerType, null);getMenu().setLayerType(layerType, null);if (getSecondaryMenu() != null) {getSecondaryMenu().setLayerType(layerType, null);}}});}}

上面这段代码是在SlidingMenu类的 最底部,主要的功能是在Android 3.0以上的系统启用硬件加速去绘制滑动的效果。

我推测在Android 5.0系统下,该代码可能和Cocos2dx的绘制冲突了。

解决的办法很简单

if (Build.VERSION.SDK_INT < 11) return;

改成

if (Build.VERSION.SDK_INT < 11 || Build.VERSION.SDK_INT > 20) return;


1 0
原创粉丝点击