1. 程式人生 > >Qt on Android 讓 Qt Widgets 和 Qt Quick 應用全屏顯示

Qt on Android 讓 Qt Widgets 和 Qt Quick 應用全屏顯示

               

    Android 系統版本很多,較新的 4.4 ,較老的 2.3 ,都有人用。 Qt on Android 開發的 Android 應用,預設在 Android 裝置上是非全屏的。而有些應用的需求是全屏顯示,比如遊戲。那麼怎麼樣才能做到這點呢?

    我們需要分 Android 系統版本來說。

Android 2.x

    對於 4.0 以前,比如 2.2 、 2.3 的系統,可以修改 AndroidManifest.xml 檔案來實現全屏。

    首先需要為 Qt on Android 應用生成一個 AndroidManifest.xml 檔案,具體參考《Qt on Android:圖文詳解Hello World全過程

》一文。建立 AndroidManifest.xml 的示意圖如下:


    點選上圖中標號為 7 的那個按鈕即可建立一個 AndroidManifest.xml 檔案。該檔案預設生成在 Qt 專案目錄下的 android 子目錄內。

    然後需要開啟 AndroidManifest.xml 檔案,找到 Activity 標籤,為其加入下面這個屬性:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

    注意和前、後的其它屬性之間留空格。

    在 2.x 系統上執行你的 Qt on Android 應用吧,已經全屏了,連標題欄都沒有了。

Android 4.x

    Android 系統版本到了 4.0 以後,前面那種設定活動主題的方式無效了。我們需要在 Java 程式碼中為 Activity 設定一個全屏的視窗標記。

    這在 Java 撰寫的 Android 應用上很簡單,只需要在 Activity 的 onCreate() 方法中加入下面的程式碼:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

    可是到了 Qt on Android 應用,就稍微有些複雜了。

    一步一步說吧,這次以我們的 Qt Quick App 為例來說明,先參考《

Qt Quick 之 Hello World 圖文詳解》一文建立一個專案,我演示需要,還是以 HelloQtQuickApp 為基礎修改的。

    先看下修改前的效果圖(我在 4.0.3 系統的機頂盒上執行):


    注意到圖片下方的狀態列了吧。

生成 AndroidManifest.xml 

     參考上一節吧,把 Activity 的 Theme 屬性也設定一下。

為 Qt 專案新增 Java 檔案

    話說 Qt on Android 應用, Qt 部分的程式碼以 JNI 的方式經由 Java 程式碼啟動的。為了能夠啟動 Qt 程式碼,進入 Qt 的世界, Qt 框架提供了 QPA 層以及必要的 Activity 、 Application 實現。詳情參考《Qt on Android Episode 1(翻譯)》和《Qt for Android 部署流程分析》兩篇文章。

    這裡以 Qt 5.2.0 為例來作一簡單說明。

QtActivity 簡析

    如果你觀察 AndroidManifest.xml 檔案,會發現裡面的 Activity 標籤,指定的 activity 名字是:"org.qtproject.qt5.android.bindings.QtActivity" 。沒錯,就是它!它是由 Qt 框架提供的,你 Qt on Android 應用的入口。 QtActivity 的位置在這裡:

c:\qt\Qt5.2.0\5.2.0\android_armv5\src\android\java\src\org\qtproject\qt5\android\bindings\QtActivity.java

    感興趣的可以開啟這個 Java 檔案研究一下。

    下面是 QtActivity.java 的 onCreate 函式的摘錄:

...    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        try {            setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));        } catch (Exception e) {            e.printStackTrace();        }        if (Build.VERSION.SDK_INT > 10) {            try {                requestWindowFeature(Window.class.getField("FEATURE_ACTION_BAR").getInt(null));            } catch (Exception e) {                e.printStackTrace();            }        } else {            requestWindowFeature(Window.FEATURE_NO_TITLE);        }    ...    }...

    如你所見, QtActivity 區分了 SDK 版本, 10 以上的請求 FEATURE_ACTION_BAR 特性, 10 以下(Android 2.3及以下)的版本不要 title (太難看了,只顯示應用名字,木啥用)。

    你懂的,  Qt Creator 可以編譯 Java 原始碼(通過呼叫 Ant ), QtActivity 就是這樣編譯到你的 APK 中的。所以,我們也可以新增自己的 Java 程式碼嘍。

    我們要新增全屏標記,需要繼承 QtActivity 類來實現一個新的 Activity 。當然如果你想粗暴地解決這個問題,可以直接修改 QtActivity.java ,直接加一行程式碼即可。什麼程式碼?看下面。

實現QtFullscreenActivity

    QtFullscreenActivity 繼承自 QtActivity 類,程式碼非常簡單。如下:

package an.qt.helloQtQuickApp;import android.content.Context;import android.content.Intent;import android.app.PendingIntent;import android.util.Log;import android.os.Bundle;import android.view.WindowManager;public class QtFullscreenActivity extends org.qtproject.qt5.android.bindings.QtActivity{    private final static String TAG = "QtFullscreen";    @Override    public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);    }}

    上面程式碼中 "getWindow()" 起始的那行,就是設定全屏標記的。

新增 QtFullscreenActivity 到 pro 檔案

    我把 QtFullscreenActivity.java 檔案放在了 android/src/an/qt/helloQtQuickApp/ 下面,所以 pro 檔案中相關的部分是醬紫的:

OTHER_FILES += \    android/AndroidManifest.xml \    android/src/an/qt/helloQtQuickApp/QtFullscreenActivity.java

    需要注意的是, Java 程式碼中的包名(QtFullscreenActivity第一行),和路徑是嚴格匹配的, Java類名則和原始碼檔名嚴格匹配。

    然後你可以看到下面的專案檢視了:


修改 AndroidManifest.xml 

    這是改動的最後一步了。

    我們實現的 Activity 名字是 QtFullscreenActivity ,所以呢, AndroidManifest.xml 檔案中也要修改,保持一致。見下面:

<?xml version='1.0' encoding='utf-8'?><manifest xmlns:android="http://schemas.android.com/apk/res/android"     android:versionCode="1"     android:installLocation="auto"     package="an.qt.helloQtQuickApp"     android:versionName="1.0">    <application         android:name="org.qtproject.qt5.android.bindings.QtApplication"         android:label="@string/app_name">        <activity             android:name="an.qt.helloQtQuickApp.QtFullscreenActivity"             android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation"             android:theme="@android:style/Theme.NoTitleBar.Fullscreen"             android:label="@string/app_name"             android:screenOrientation="unspecified">            <intent-filter>...</manifest>


    好啦,到此為止,全部改動就緒。執行我們的 HelloQtQuickApp 吧。

    下面是現在執行的效果:


    好啦,到此結束。 

    本系列的其他文章: