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