Qt for Android 開發大坑
作者: qyvlik
Qt 5.5.1
這裡說一說比較常見的 Qt 開發安卓的大坑。希望同學們不要做無謂的掙扎,跳過這些坑。
輸入框
PS: QTBUG-41170, 在 2017 年 4 月,有一個比較好解決方案出現了,程式碼: AndroidKeyboardSize,部落格:QML: Resize controls when Android virtual keyboard come up
首當其衝的是輸入框,Qt 的輸入在安卓上表現不佳.
無法支援安卓原生的輸入法訪問 Qt 的輸入框,就是安卓輸入法無法複製,貼上,剪下 Qt 輸入框中的文字。
無法支援使用觸控的方式選中 Qt 輸入框中的文字。
如果輸入框的位置處於應用底部,類似於 IM 那種聊天工具,應當注意。
a. 如果應用
Activity
設定為android:windowSoftInputMode="adjustResize"
,彈出輸入法時,應用介面就會進行縮放,這個時候,應用介面就會閃爍。b. 如果應用
Activity
設定為android:windowSoftInputMode="adjustPan"
,應用介面的頭部就會被頂出螢幕。為了修復上訴的問題,參照如下步驟
a. 先設定應用
Activity
設定為android:windowSoftInputMode="adjustPan"
,這樣,彈出輸入法時,就不因為介面縮放而閃爍。b. 獲取到安卓輸入法高度。
c. 修改輸入框,使其被點選獲取焦點之前,先彈出輸入法(
Qt.inputMethod.show()
),由於不是輸入框獲取焦點而彈出輸入發,所以介面既不會閃爍,也不會相對螢幕向上位移。(就是在TextField
上放一個MouseArea
)d. 在輸入法彈出後,就可以獲取鍵盤高度(如果在安卓上獲取鍵盤高度,是需要寫一些 Java 程式碼的)。
e. 獲取到鍵盤高度後,直接位移輸入框(延時處理),然後
forceActiveFocus
強制獲取焦點。上訴解決方案又引發一個問題,且聽我細細道來。
a. 首先
Qt.inputMethod.show()
在安卓上可以直接顯示鍵盤,然後顯示時不會直接縮放介面(造成閃爍)或者將介面頂出螢幕。b. 接著,輸入框是一個特殊的控制元件,在輸入框獲取虛擬鍵的焦點後,安卓上的輸入法會直接記住這個控制元件的位置。
c. 再下一次直接呼叫
Qt.inputMethod.show()
時,會找到上一次獲取焦點的輸入框的位置,根據這個位置,彈出虛擬鍵破並將介面頂出螢幕,然後輸入框才會拿到鍵盤高度,位移。為了再解決上訴的問題,還得記錄下安卓上鍵盤的高度,然後根據鍵盤高度決定先使用
Qt.inputMethod.show()
彈出鍵盤,還是先位移輸入框。
已經具現化的解決方案GDPURJYFS/WellChat,演示視訊安卓修復鍵盤彈出介面不友善問題修復終版Demo。當然現在這些方案都有各種各樣的問題,具體要做的,其實是希望官方修復鍵盤彈出,介面縮放時閃爍的這個問題。
其他方案:QML: Resize controls when Android virtual keyboard come up
攝像頭
Qt 安卓應用上的攝像頭,如果直接使用 QtMultimedia::Camera
可能會出現無法很好對焦的情況,並且各個機型和不同版本系統上表現不一致,華為手機對 Qt 的支援不佳,問題會稍微多一些。
解決方法:
可以直接通過呼叫系統的攝像軟體,具體參照QtAndroid詳解(3):startActivity實戰Android拍照功能,具體程式碼 A-week-to-develop-android-app-plan/demos/CallNativeCamera。
SplashScreen
啟動屏,據多數 Qter 反映,Qt 安卓應用啟動時,會顯示一個無內容,帶有標題和應用 Icon 的黑色畫面,無法直接預先顯示 SplashScreen。
本地多媒體縮圖
網路資源可以通過現有的 C 介面進行優化,快取。但是本地多媒體縮圖支援,需要自行構建一個好用的。
網頁支援
Qt 對移動平臺的網頁支援,應該是試圖通過在 QtSurface
上繪製原生網頁進行支援,所以 Qt 的網頁支援對於移動平臺來說是很孱弱的。然後 QtWebEngine 是基於谷歌的 Chromium 的,Chromium 現在對 VS 編譯支援最好,Chromium 對 MinGW 的支援基本是沒有的。
現在 Qt 在手機裝置上,使用 QtWebView 也就是在 QtSurface 上繪製原生網頁作為 Qt 在移動端上網頁的解決方案。
本地化地圖
QtQuick 中是支援地圖外掛的,但是官方只是預製了 here 等幾個國外的地圖外掛,百度地圖只能自己去封裝外掛。
相關討論有關 QML QtLocation 的 Plugin 的使用問題。
写评论
很抱歉,必須登入網站才能發佈留言。