首页 > 代码库 > Unity3D与android事件冲突的解决办法

Unity3D与android事件冲突的解决办法

Unity视图嵌入Android视图时曾经碰到过Android视图无法取得焦点的问题,原因就在于,NativeActivity在Android2.3以后被引入而且不支持该版本以下的设备。因为触摸/运动事件处理在本机代码,Java视图通常不会看到这些事件。

那么我们怎么去解决这些问题呢?

方法一:

在统一转发机制允许将事件传播到DalvikVM,AndroidManifest.xml文件中的activity子节点下增加如下两行代码:

<meta-data android:name="android.app.lib_name" android:value=http://www.mamicode.com/"unity" />   >
这样会产生一个问题,先看下图:


这样一个界面,我要双击屏幕能显示和隐藏上面的titlebar,那中间的按钮式u3d里面的。
实现监听双击屏幕,我在Activity的onTouchEvent(MotionEvent event)这个方法里面来监听事件然后处理,但是如果没有在Activity的配置文件里面配置<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value=http://www.mamicode.com/"true" />,也就是上面的方法,那么onTouchEvent(MotionEvent event)这个方法就不会执行,如果配置了,那么就点击不到Unity3d里面的按钮,也就是中间的那两个。也就是说,u3d和android的点击事件不能双得?

于是我就采用了下面的一个办法:

方法二

在U3d的View上面覆盖一个View,比如RelativeLayout,然后不要在Activity的子节点进行相关的分发机制的控制,意思是U3d的点击事件还是它们自己处理,不会分发到java的Dalvik上,然后,点击事件的,比如我要监听双击事件,那么怎么办呢?就靠覆盖的那个View来实现,给那个View添加onTouchEvent的监听,从而来判断是否发生了点击事件,关于点击事件如何判断,请大家参考我的另外一篇博客。

android判断双击事件(参考android源码,判断时间间隔和范围)

这样呢,就对于U3d和Android的问题都处理了,看起来貌似已经完美了,但是还是会产生一个问题:

对于添加的那个View的话,设置了onTouchEvent之后,但是仅仅能监听到ACTION_DOWN,ACTION_UP和其他的事件都监听不到。根据事件分发的机制,View处理了ACTION_DOWN事件之后,应该会传入到u3d中,也就是u3d的native方法处理了点击事件,处理了之后,可能没有传递回来给java的Dalvik,然后造成了这种现象?现在只是我的猜测,真正的原因还需要进一步的验证。

方法三

其实,我们上面的做法都是舍近求远了,因为在U3d中,完全可以调用android的方法,所以下面的思路就是,U3d中来获取点击事件,然后如果需要android做什么处理,则android给出相应的方法,让u3d来进行调用,那么在点击事件上面也就不会出现冲突了。

关于这种方法的处理,我会专门在写一篇博文来讲述。但是可以肯定的是,这种方法才是正确的。

Unity3D与android事件冲突的解决办法