Unity3D与android事件冲突的解决办法
来源:互联网 发布:汇丰创投网络借贷 编辑:程序博客网 时间:2024/06/05 14:41
Unity视图嵌入Android视图时曾经碰到过Android视图无法取得焦点的问题,原因就在于,NativeActivity在Android2.3以后被引入而且不支持该版本以下的设备。因为触摸/运动事件处理在本机代码,Java视图通常不会看到这些事件。
那么我们怎么去解决这些问题呢?
方法一:
在统一转发机制允许将事件传播到DalvikVM,AndroidManifest.xml文件中的activity子节点下增加如下两行代码:
<meta-data android:name="android.app.lib_name" android:value="unity" /> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
这样会产生一个问题,先看下图:
这样一个界面,我要双击屏幕能显示和隐藏上面的titlebar,那中间的按钮式u3d里面的。
实现监听双击屏幕,我在Activity的onTouchEvent(MotionEvent event)这个方法里面来监听事件然后处理,但是如果没有在Activity的配置文件里面配置<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="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方法(非插件方式)
- Unity3D与android事件冲突的解决办法
- Android Activity使用OnGesture事件以后与子View的Click事件冲突解决办法
- 背景视图上点击事件与tableView冲突的解决办法
- 在ListView中的Text添加spannableString 点击事件与ListView的OnItemClick事件冲突的解决办法
- TableView cell的选中事件 与手势点击事件 冲突解决办法
- Android ViewPager与子控件点击事件冲突的解决方案
- Android处理滑动与点击事件的冲突
- Android处理滑动与点击事件的冲突
- Android View的事件分发机制与滑动冲突解决方案
- Android 滑动与点击事件冲突的处理
- 【事件冲突】ScrollView嵌套ViewPager冲突的解决办法
- touch事件与点击事件的冲突
- Android onTouch事件与ScrollView冲突
- android 解决ViewPager与Gallery事件冲突
- android 事件分发与滑动冲突
- Android事件分发机制与滑动冲突
- android事件分发与滑动冲突
- Android中scrollview与webview冲突事件
- JasperReport for Servlet Demo
- int a[5]={1,2,3,4,5};printf("%d\n", *((int*)(&a+1)-2);
- javascript的闭包
- HDU 2047 阿牛的EOF牛肉串
- :)
- Unity3D与android事件冲突的解决办法
- PHP中String字符串处理函数完整版
- 阶乘的笔试题
- 看了《从二层至三层,至面向对象》的一个总结
- sql case when then else
- 静态变量和非静态(实例)变量的区别
- 游戏中角色曲线行走的算法
- 埃弗雷特▪M▪罗杰斯《硅谷热》
- [Leetcode] Partition List