Unity 打包成aar,作为一个view 在Android原生中引用,这个时候会发现设置不会透明。
UnityPlayer 作为暴露在外面的View 继承与 FrameLayout
public class UnityPlayer extends FrameLayout { public static Activity currentActivity = null; private boolean c = false; private boolean d = true; private h e = new h(); private final ConcurrentLinkedQueue f = new ConcurrentLinkedQueue(); private BroadcastReceiver g = null; UnityPlayer.c a = new UnityPlayer.c(0);
绘制是基于SufaceView 的,使用的native方法
this.l = new SurfaceView(var1); this.l.getHolder().setFormat(2); this.l.getHolder().addCallback(new Callback() { public final void surfaceCreated(SurfaceHolder var1) { UnityPlayer.a(UnityPlayer.this, var1.getSurface()); } public final void surfaceChanged(SurfaceHolder var1, int var2, int var3, int var4) { UnityPlayer.a(UnityPlayer.this, var1.getSurface()); } public final void surfaceDestroyed(SurfaceHolder var1) { UnityPlayer.a(UnityPlayer.this, (Surface)null); } }); this.l.setFocusable(true);
一般的话如果需要SufaceView 透明只需设置
mSurfaceHolder.setFormat(PixelFormat.TRANSLUCENT);
mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);但是 canvas 现在无法设置,unity的alpha通道不起作用,设置 PixelFormat.argb8888 也不起作用。
Unity本质上对于原生的Android app来说就是一个单纯的View级别,然后主要绘制在于surfaceview上的绘制,所以处理透明就是处理对于surfaceView 透明处理。但是设置完成之后会发现无法实现。是因为在unity的底层强制绘制了一层背景。
所以咱们曲线救国需要用TextureView 代替 SufaceView 利用反射机制 获取 sufaceview 的callback交给 texture 使用,然后把 sufaceview 宽高设置为0。更改unity的so文件 libunity.so 来去掉强制绘制的那一层背景(工具我用 Hopper Disassembler)