Android显示Unity视图
2015-05-04 11:56
281 查看
第一次写blog,呵呵,有点激动,主要是方便自己以后复习,写的不好请见谅。。。这次遇到的问题纠结我好久,关键是对Android不熟悉,下面我来说一下我的问题:用Unity制作Android上的悬浮窗口,窗口背景透明,用Unity4.2很简单,只要把摄像机的Clear Flags属性设置成Solid Color,然后BackGround属性的RGBA均设置为零,然后再在Android里设置一下背景透明就可以了。Android的设置:
private LinearLayout view; private GLSurfaceView mUnityView; public FloatWindowSmallView(Context context) { super(context); mContext = context; windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); LayoutInflater.from(context).inflate(R.layout.float_window_small, this); view = (LinearLayout) findViewById(R.id.small_window_layout); viewWidth = view.getLayoutParams().width; viewHeight = view.getLayoutParams().height; LayoutParams lp = new LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
//主要是这里 mUnityView = new GLSurfaceView(Common.application); mUnityView.setEGLContextClientVersion(2); mUnityView.setZOrderOnTop(true); mUnityView.setZOrderMediaOverlay(true); mUnityView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); mUnityView.setRenderer(Common.mUnityPlayer); mUnityView.getHolder().setFormat(PixelFormat.TRANSLUCENT); view.addView(mUnityView,0,lp); Common.mUnityPlayer.requestFocus(); Common.mUnityPlayer.resume(); //TextView percentView = (TextView) findViewById(R.id.percent); //percentView.setText(MyWindowManager.getUsedPercentValue(context)); mLongPressRunnable = new Runnable() { @Override public void run() { //performLongClick(); openBigWindow(); } }; }但是Unity4.6这样设置就不行,背景是一片黑色:所以换了个思路,将Unity视图输出成一个纹理,见纹理编译成bity[]传给Android,Android再解析成Imageview显示出来。1、将摄像机视图输出成纹理:新建一个Render Texture ,将其拖给摄像机的Target Texture 2、将Render Texture 转换成byte[]
this.jc = new AndroidJavaClass("com.gesture.util.ToUnity");
放在Update每桢更新
#if UNITY_ANDROID && !UNITY_EDITOR byte[] bts = UnityView(); this.jc.CallStatic("picture", bts); #endif
public byte[] UnityView() { Texture2D myTexture2D = new Texture2D(pic.width,pic.height); RenderTexture.active = pic; myTexture2D.ReadPixels(new Rect(0, 0, pic.width, pic.height), 0, 0); myTexture2D.Apply(); RenderTexture.active = null; byte[] bytes = myTexture2D.EncodeToPNG(); Destroy (myTexture2D); return bytes; }3、Android的设置XML配置文档:
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/small_window_layout" android:layout_width="120dp" android:layout_height="120dp" > <ImageView android:id="@+id/image_view" android:layout_width="119dp" android:layout_height="119dp"/> </LinearLayout>
<pre name="code" class="java">private LinearLayout view; private static ImageView image;public FloatWindowSmallView(Context context) {super(context);windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);LayoutInflater.from(context).inflate(R.layout.float_window_small, this);view = (LinearLayout) findViewById(R.id.small_window_layout);viewWidth = view.getLayoutParams().width;viewHeight = view.getLayoutParams().height;image = (ImageView) findViewById(R.id.image_view);view.addView(Common.mUnityPlayer.getView());Common.mUnityPlayer.requestFocus();Common.mUnityPlayer.resume();}
//把传输过来的字节流转换成Bitmappublic static Bitmap getBitmaoByStream(byte[] imageByte){if (imageByte != null){ByteArrayInputStream byteImage = new ByteArrayInputStream (imageByte);return BitmapFactory.decodeStream(byteImage);}else{return null;}}//更新Imageviewpublic static void ShowTexture(byte[] b){Bitmap bitmap = getBitmaoByStream(b);image.setImageBitmap(bitmap);}4、Unity端调用Android端方法
//显示unity中Render Texture的内容, 供unity调用public static void picture(final byte[] b){new Handler(Looper.getMainLooper()).post(new Runnable(){@Overridepublic void run(){FloatWindowSmallView.ShowTexture(b);}});}Unity端每桢调用此方法,来刷新ImageView来显示Unity视图,达成效果!!!但是目前还有一点小问题待解决,就是ImageView不能完全覆盖LinearLayout,否则Unity不运行,还有就是运行效率问题待提高,目前就这样,后续再更新。。。
相关文章推荐
- Unity 之Bug - Scene视图的物体Game视图不显示
- 把Unity作为Android的子视图
- Android控件无法在Unity 5.6.x上显示的问题
- Android显示框架:Activity应用视图的创建流程
- Android-视图显示大量图片时的内存问题_待更新
- Android开发技巧一--weight属性实现视图的居中(半)显示
- android如何给整个视图view圆角显示
- Android自定义视图四:定制onMeasure强制显示为方形
- Android 单个App显示多个任务列表预览视图
- unity, RT .DiscardContents ()导致android上RT不显示
- android列表视图切换:GridView和ListView两种方式来显示一个列表
- Android中BaseFragment封装多状态视图显示
- Android显示框架:Activity应用视图的渲染流程
- Android中图片处理(压缩 保存 显示 截屏 视图View转为图片Bitmap)函数工具类
- unity中Image显示android手机SD卡中的图片
- Unity安卓Android与iOS保存图片并显示在相册
- 【Unity】在IOS和Android上显示内嵌网页的方式
- Android——个性化Progress电池显示视图
- unity在android显示界面(UnityPlayerActivity)不重复加载且app退出杀掉所有界面的两种方法
- Android中自定义Toast视图和修改显示位置