go语言能编android程序吗,用 Golang 开发 Android 应用(二)—— 简单 UI-Go语言中文社区...
計劃按以下的內(nèi)容更新
簡單 UI
關(guān)于開發(fā)一個應(yīng)用,要有自己的應(yīng)用名(顯示用),和包名(真正唯一的應(yīng)用名),簡單說一臺 Android 手機中所有應(yīng)用的包名是唯一的,如果新安裝的應(yīng)用包名和已安裝的應(yīng)用重復(fù)則只能替換安裝(不可共存)。這就需要修改 AndroidManifest.xml。
修改 AndroidManifest.xml
先看一下之前的例子里的 AndroidManifest.xml
package="gooid.mainnative"
...
...
...
這里 package=“gooid.mainnative” 雙引號中是包名(PackageName)可以改成你自己的,有一定的規(guī)則(可搜索"Android命名規(guī)范")。
這個 android:label=“WallPaperTwinkle” 就是應(yīng)用在桌面顯示的應(yīng)用名了。
還有 中 “WallPaperTwinkle” 是表示引用的so名,此處表示 lib 名為 libWallPaperTwinkle.so 因此如果改成 “UIDemo” 的話,前面講的編譯命令要作相應(yīng)修改: go build -buildmode c-shared -o basiclib%ABI%libUIDemo.so
通過定制包名,應(yīng)用名,和庫名就可以區(qū)分每個不同的應(yīng)用了(其實還有應(yīng)用圖標,這個以后再講)。
接下來就該編碼了。
應(yīng)用回調(diào)說明
從NDK的角度來說,一個 Android 應(yīng)用實現(xiàn)以下的 Callbacks 就可以了,其中的回調(diào)函數(shù)可以為空,實現(xiàn)必要的回調(diào)就行了,所以下面忽略了不常用的回調(diào)。
type Callbacks struct {
Create func(*Activity, []byte)
...
Destroy func(*Activity)
...
FocusChanged func(*Activity, bool)
....
// Window
WindowCreated func(*Activity, *Window)
WindowDestroyed func(*Activity, *Window)
WindowDraw func(*Activity, *Window)
WindowResized func(*Activity, *Window)
WindowRedrawNeeded func(*Activity, *Window)
// Touch is called by the app when a touch event occurs.
Event func(*Activity, *InputEvent)
// Sensor
Sensor func(*Activity, []SensorEvent)
}
如果想了解這些回調(diào)的詳細信息,當然是參考管方文檔了。在這里就簡單說一下常用的幾個。
Activity 相關(guān)
Create: 應(yīng)用創(chuàng)建時被調(diào)用,從應(yīng)用的生存周期來說,只調(diào)用一次。可用于初始化全局和只需執(zhí)行一次的操作
Destroy: 應(yīng)用徹底被銷毀時調(diào)用,但不保證會被調(diào)用,所以一些必須要執(zhí)行的清理/回收工作不能依賴它的調(diào)用
FocusChanged: 這個好理解,應(yīng)用得到/失去焦點時被褲調(diào)用
事件處理
Event: 收到輸入事件時被調(diào)用,包括 key 和 motion (觸摸) 事件
Sensor: 收到Sensor事件時被調(diào),比如處理重力加速度變化(G Sensor)和距離感應(yīng)等
Window 相關(guān)
WindowCreated: 在 Window 創(chuàng)建后被調(diào)用
WindowDestroyed: 在 Window 銷毀后被調(diào)用
WindowResized: 在 Window size改變后被調(diào)用
WindowRedrawNeeded 在 Window 需要 redraw 時調(diào)用,一般理解為 Window 的 size、client size 或 focus (準確的說是應(yīng)用的 focus)改變引起必須要重繪的情況。- WindowDraw 在收到某些事件后,會自動調(diào)用。這個不是原生的回調(diào),是為了簡化程序邏輯加的,繪制操作在此函數(shù)中完成。如果沒有提供這個回調(diào),開發(fā)者自行在其它地方繪制則有可能繪制失敗(openGLES 上下文限制)或應(yīng)用崩潰。
用 OpenGL ES 實現(xiàn) UI
在 Android NDK 下要實現(xiàn)圖形界面(GUI)需要用OpenGLES來實現(xiàn),如果熟練OpenGL,那就事半工倍了。這里并不打算細說 OpenGLES 的用法。直接參考 UIDemo, 它簡單顯示了一個經(jīng)典的三角形,點擊會出現(xiàn)變化。
有人會說了,我不會 OpenGL, 況且就算會,要用它來實現(xiàn)一套GUI也是很困難的事性。
稍安勿躁,之所以先給這個例子就是讓大家清楚它的起源 ^_^ 。
接下來就是一個直正的GUI的例子。
這個應(yīng)用用 Tree 來顯示 Android property (shell getprop),它是通過使用 Dear ImGui 封裝的 Go 版本 來顯示 Android 所有屬性。
因為 Dear Imgui 源碼是 C++,因此這次編譯要用到 g++ ,還是先要配置一下環(huán)境,這次比較簡單,先按上一篇所說的配置好,在上一篇的基礎(chǔ)上:
set CXX=%GCC_H%-g++
set CGO_CXXFLAGS=-D__ANDROID_API__=%SDK_API%
在 android-ndk-r16b-windows-x86_64.zip 中找到 android-ndk-r16bsourcescxx-stlgnu-libstdc++4.9libs 找到對應(yīng)的 libsupc++.a 并拷貝到之前提到的 sysrootusrlib 下
這樣就可以編譯過了。
可能有老鳥會感覺出來總覺得缺點什么?恭喜你,你的感覺是對的,還沒有說明關(guān)于 C++ 頭文件相關(guān)的操作,幸運的是 Dear Imgui 并沒有 include C++ 的頭文件,所以上面沒有提到它。如果要用到,類似的考考考(拷貝)就好了。
通過這一節(jié),同時也了解了在 golang 中集成 C++ 代碼的環(huán)境配置方法。
關(guān)于 Dear Imgui
這里就不詳細講 Dear Imgui 的用法了,看看它的例子就差不多能會。
如果上面的實例在你的手機上運行出現(xiàn)問題,首先確認你的手機內(nèi)存和分辨率,會不會分辨率高但內(nèi)存少,特別是用仿真或低端機,仿真可能是配置的時候沒配置合適的內(nèi)存大小。
可用 adb shell free 查看一下內(nèi)存大小。
也可以通過把增加 WINDOWSCALE 來減少內(nèi)存的使用。
補充說明
在之后的例子中看到有這樣的代碼
item := cam.previewIndex
if imgui.Combo("pixels", &item, cam.comboText) {
cam.previewIndex = item
}
這里為什么不直接寫imgui.Combo("pixels", &cam.previewIndex, cam.comboText) ? 請參考cgocheck的說明。如果不這樣會出現(xiàn)panic,這個需要特別注意。
這里有 Go 中文文檔 。
其它 GUI
如果想嘗試其它的 GUI 還有其它選擇。這里列舉其中一些。
關(guān)于 Golang 版的 Dear Imgui 有另外兩個:
nuklear C 版本的單文件 GUI
gxui 純 Go 實現(xiàn)的 GUI (實驗性的,已不再維護)
總結(jié)
以上是生活随笔為你收集整理的go语言能编android程序吗,用 Golang 开发 Android 应用(二)—— 简单 UI-Go语言中文社区...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android标题背景色,设置标题背景颜
- 下一篇: sqlite数据库android使用教程