Unity显示导航栏比较麻烦,显示状态栏挺简单的,网上百度有很多方案。
主要实现方案是Github上的一个工程https://github.com/Over17/UnityShowAndroidStatusBar
这个工程有aar包,也可以直接使用,但是我比较反感就是修改xml启动Activity的方案的,所以想直接在Unity用反射实现。
他的安卓工程可以看看,只有三个函数。
public void ShowStatusBar()
{
currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
{
AndroidJavaObject window = currentActivity.Call<AndroidJavaObject>("getWindow");
window.Call("clearFlags", 1024);
AndroidJavaObject decorView = window.Call<AndroidJavaObject>("getDecorView");
int i = decorView.Call<int>("getSystemUiVisibility");
decorView.Call("setSystemUiVisibility", i & ~GetFlag());
window.Dispose();
decorView.Dispose();
}
));
}
private int GetFlag()
{
int m = 4096 | 256 | 1024 | 512 | 2 | 4;
return m;
}
这个是显示的代码,但是只这样写会有问题,就是显示之后会自动隐藏,所以还需要一个监听。
private void AddListener(OnSystemUiVisibilityChangeListener OnSystemUicallback)
{
currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
{
AndroidJavaObject window = currentActivity.Call<AndroidJavaObject>("getWindow");
AndroidJavaObject decorView = window.Call<AndroidJavaObject>("getDecorView");
decorView.Call("setOnSystemUiVisibilityChangeListener", OnSystemUicallback);
}
));
}
public class OnSystemUiVisibilityChangeListener : AndroidJavaProxy
{
public XFRecorder xf;
public OnSystemUiVisibilityChangeListener(string packetname, XFRecorder xf) : base(packetname)
{
this.xf = xf;
}
private void onSystemUiVisibilityChange(int var1)
{
xf.ShowStatusBar();
}
}
这是监听代码,在回调中调用显示代码
这样做有一个问题,就是启动的时候,导航栏会有一点闪烁感