天天看點

Maemo Linux手機平台系列分析:4 Maemo的GUI元件

這部分的内容:

1 介紹

2 分解一個簡單的GUI程式

3 GUI元件

4 Hildon使用者視圖

5 事件循環模型

6 異步程式設計模型

1 介紹:

這部分主要介紹Maemo平台的基本圖形使用者接口、GUI程式設計元件、Hildon桌面的不同視圖和基于事件的GUI模型以及信号。

2 分解一個簡單的GUI程式

通過比較Maemo平台的兩種程式:一個簡單的指令行程式和一個簡單的GUI程式,我們可以看出GUI程式使用的不同的庫。

Maemo平台提供了很多APIs去處理GUI、資源管理、以及內建應用到application framework.

這些APIs也是隐藏在“X”庫中的,Maemo GUI程式不必要去關系這些非常底層的庫。下面我們就來分解一個Maemo的程式。

Maemo Linux手機平台系列分析:4 Maemo的GUI元件

[一個簡單GUI程式的分解 ]

GUI元件

Maemo Linux手機平台系列分析:4 Maemo的GUI元件

[ Internet Tablet 圖形使用者接口示例 ]

Maemo平台的GUI framework叫做Hildon. 它是基于GNOME架構的一些基本技術,其中最重要的就是GTK+. 當然了,Hildon并非拿過來就不變的,而是對GTK+做了一些完善提高,使得GTK+更适合于Internet Tablets産品。比如說: Hildon widgets, theme engine, image server, 任務導航,控制台,狀态條,觸摸屏輸入法,觸摸筆,以及高像素的視窗關系系統,等等。

Maemo的GUI程式設計接口都是基于GTK+ widgets和Hildon擴充之上的。Hildon環境中的大部分GTK+ widget沒有修改,其中重要的修改主要展現在:由Hildon window代替了GTK+的通用main window.

由于應用程式的視窗把“程式區”填滿了,是以在一個時間點上隻有一個程式可見。在不同程式之間的切換是通過任務導覽列(Task Navigator)完成的。導覽列内也包含一些菜單。狀态條用于顯示一些關閉或者最小化應用程式的菜單和按鈕。應用程式隻有一個主菜單,同時可以有一些子菜單,這些子菜單是水準向右擴充開的,是以,開發人員必須小心謹慎地設計你的菜單,因為留給菜單的空間實在有限。當使用者用觸摸筆輸入時,螢幕上的虛拟鍵盤會自動打開。

狀态條/标題條可以通過自定義的插件程式進行擴充,用以提供不同的狀态資訊。同時,主視窗上面允許運作一些插件,這些插件叫做home applets. 這些插件程式一般是一些小的應用程式,比如:新聞貼紙,天氣預報,時鐘,股票等等。

Hildon使用者接口視圖

Hildon具有不同的布局模型提供給應用程式使用,甚至是視圖之間的動态切換。

正常視圖:

  • 應用程式區域占用696×396 像素
  • 任務導覽列,狀态條/标題條可見
Maemo Linux手機平台系列分析:4 Maemo的GUI元件

[正常視圖 ]

帶有工具條的正常視圖:

  • 如果應用程式區域占用696×360 像素,那麼還可以容下一個窄條工具欄
  • 如果應用程式區域占用696×310像素,那麼可以放下兩個工具欄 (比如. 應用工具欄和查找工具欄)
  • 任務導覽列,狀态條/标題條可見
  • 螢幕底部的背景圖檔被工具欄覆寫了
Maemo Linux手機平台系列分析:4 Maemo的GUI元件

[帶有工具條的正常視圖]

全屏視圖:

  • 這種情況下,應用把整個螢幕都占用了,填滿了 800×480 像素
  • 任務導覽列,狀态條/标題條,以及背景圖檔都隐藏了
  • 全屏和非全屏之間的切換可以通過一個按鍵或者軟體控制
Maemo Linux手機平台系列分析:4 Maemo的GUI元件

[全屏視圖]

帶有工具欄的全屏視圖

  • 全屏可調
  • 如果程式占用800×422像素,剩下隻能放置一個簡單的工具條了
  • 如果程式占用800×370像素,還可以放置兩個工具條
  • 任務導覽列,狀态條/标題條,以及背景圖檔都隐藏了
  • 工具條是可以伸縮的
Maemo Linux手機平台系列分析:4 Maemo的GUI元件

[帶有工具欄的全屏視圖]

基于事件循環的模型

GTK+是一個基于事件循環(或者說是事件驅動的)、跨平台的GUI庫。在這種模型下,如果使用者什麼也不幹,則GTK+蹲在它的main loop裡面等侯使用者的輸入。

當使用者有動作了,比如:

1)     點選一下按鈕

2)     然後這個main loop就會被喚醒

3)     進而發送對應的事件給一些widgets

4)     當widget接收到該事件,會轉發一個或多個信号出去

5)     這些信号會被發送給于這些信号綁定的應用

6)     應用的回調函數(callback)接着被觸發

7)     當回調函數完成後,GTK+會傳回主循環,再進行蹲點守候

Maemo Linux手機平台系列分析:4 Maemo的GUI元件

[基于事件循環的模型]

有些工具可以輔助設計這些UI界面,普遍使用的是Gazpacho和Glade.可以大大提高開發速度。

異步程式設計模型:

有時候,當主循環在等待事件時,應用程式還是要做些事情的。這種情況可稱之謂異步操作。異步的動作是非阻塞的,即調用者會立即傳回,而不必等待被調用者的及時響應。當然了,調用者也不是不負責的,它也要指定一個回調函數,這回調函數是在其指定動作發生時再調用。

使用異步操作可以使得應用界面響應更快,而不至于僵死不動。

舉幾個這方面的例子:

例1:從網絡讀取資料,就是這樣的操作,UI界面要給人活着的感覺,同時底下的資料還要源源不斷的讀取;GnomeVFS有一整套這樣的異步操作函數可供使用;

例2:D-Bus,這是Maemo平台中頻繁使用的,D-Bus也有一整套的異步操作函數;

還有一種方法可以實作異步操作,就是使用多線程,不過,Maemo并不推薦使用這種方法除非你線上程程式設計方面經驗多多。過多的使用線程,弊處有二:一難調試;二容易導緻同步問題。

繼續閱讀