1. 程式人生 > >Cocos 解決華為等安卓機底部帶虛擬導航欄

Cocos 解決華為等安卓機底部帶虛擬導航欄

1、引言

  最近專案就要上線了,發現華為等一列手機帶底部導航欄。擋著了底部遊戲的一些畫面,雖然華為可以自由設定。但是還是很不方便,難道使用者進入我們的遊戲還要再設定一次,這未免太不方便了。為了給使用者帶去更好的體驗,我們打算做到自動隱藏,不用讓使用者來手動處理!

2、分析

  我們知道底部導航欄有時還是比較有用,但有時確實很煩人。比人遊戲時我們就要更大限度的利用螢幕給使用者帶來更好的體驗。什麼時候隱藏?分為以下幾種情況:

  • 當開啟我們的遊戲時,自動隱藏
  • 當從後臺切回我們的遊戲時,自動隱藏
  • 當遊戲中我們手動滑出導航欄,又沒進行操作時,自動隱藏
  • 當滑出狀態列時虛擬按鍵會跟著出來,也要處理讓其和狀態列在不操作時自動隱藏

3、解決問題

3.1、找檔案

我們首先到找到檔案,我的檔案位置是:

lua專案目錄\Cocos\cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib\Cocos2dxActivity.java

3.2、改程式碼

在如下位置新增兩個引用:
這裡寫圖片描述
上圖紅色部分程式碼如下;

import android.annotation.SuppressLint;
import android.view.View;

首先在末尾新增一個隱藏的方法,如圖:
這裡寫圖片描述
詳細程式碼如下:

@SuppressLint("NewApi"
) public void hideNavigationBar() { int uiFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar | View.SYSTEM_UI_FLAG_FULLSCREEN; // hide status bar
if( android.os.Build.VERSION.SDK_INT >= 19 ){ uiFlags |= 0x00001000; //SYSTEM_UI_FLAG_IMMERSIVE_STICKY: hide navigation bars - compatibility: building API level is lower thatn 19, use magic number directly for higher API target level } else { uiFlags |= View.SYSTEM_UI_FLAG_LOW_PROFILE; } getWindow().getDecorView().setSystemUiVisibility(uiFlags); }

然後需要在onCreate onResume 和onWindowFocusChanged 中呼叫上面方法:
我麼還沒有onWindowFocusChanged 方法,先寫一個再呼叫!

這裡寫圖片描述

詳細程式碼如下:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
   super.onWindowFocusChanged(hasFocus); 
   if( hasFocus ) {
       //這裡呼叫
       hideNavigationBar();
    }
}

下面的兩處給出截圖:

這裡寫圖片描述
如果沒有我們可以這麼寫:

@Override
protected void onCreate(Bundle savedInstanceState){
   hideNavigationBar();
   super.onCreate(savedInstanceState);
}

這裡寫圖片描述

如果沒有我們可以這麼寫:

@Override
protected void onResume() {
    hideNavigationBar();
    super.onResume();

    Cocos2dxHelper.onResume();
    this.mGLSurfaceView.onResume();
}

4、檔案下載

  到這裡,我們的檔案已經改好了。沒有手動修改的同學可以在這裡點選下載

The End
  好了,今天的分享就到這裡,如有不足之處,還望大家及時指正,隨時歡迎探討交流!!!