<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式Linux系統(tǒng)GUI特點介紹

          嵌入式Linux系統(tǒng)GUI特點介紹

          作者: 時間:2013-10-21 來源:網(wǎng)絡(luò) 收藏
          隨著Internet與網(wǎng)絡(luò)的迅速發(fā)展并向家庭領(lǐng)域不斷擴展,使消費電子、計算機、通信(3C)一體化趨勢日趨明顯,嵌入式系統(tǒng)再度成為研究與應(yīng)用的熱點。嵌入式實時操作系統(tǒng)以價格低廉、功能強大又易于移植而正在被廣泛采用,成為新興的力量,如今隨著WAP手機、PDA、機頂盒、及DVD/VCD播放機已經(jīng)迅速普及,用戶對這些手持式設(shè)備的GUI提出了更高的要求,希望能看到像PC機才擁有的華麗美觀的GUI。GUI已經(jīng)成為了人與機器溝通的橋梁,嵌入式系統(tǒng)對GUI的需求越來越高,而這一切均要求有一個輕型、占用資源少、高性能、高可靠、可配置及美觀的GUI支持。

          1 Java的圖形界面工具

          Java技術(shù)對于服務(wù)器,個人電腦和嵌入式系統(tǒng)來說是一項偉大的技術(shù)。由于其具有跨平臺等特性。Java在服務(wù)器和桌面電腦方面的應(yīng)用是非常成功的。然而在GUI方面,Java只用非常有限的一些特征去構(gòu)建圖形用戶界面。其思想就是采用平臺無關(guān)的Java應(yīng)用程序接口打包到不同的操作系統(tǒng)來開發(fā)本地圖形用戶界面,被稱之為抽象的窗口工具(AWT)。僅有普通的部件如文件域、文本區(qū)、選擇框、單選按鈕、列表框和按鈕被AWT支持,圖形和圖像的特性支持非常有限,也就是說,只足夠構(gòu)建簡單的applet程序。認(rèn)識到需要更高級的圖形用戶界面組件和圖形能力,Sun公司開發(fā)了Swing,Java 2D,Java3D,圖像的輸入/輸出,以及Java高級圖像(JAI)。Swing是用來構(gòu)建Java圖形界面的標(biāo)準(zhǔn)API(應(yīng)用程序接口),一些AWT類由Swing基礎(chǔ)而來。它有一套完全的組件從按鈕到文件域、表格、樹型和文件編輯器。這些組件不依賴于操作系統(tǒng)本地的部件,而是用原始的圖形像直線、矩形、文字畫出。這種畫代表感觀插件,它能夠模仿本地的感觀。SWT是基于Java開發(fā)的,它的設(shè)計理念是最大化了操作系統(tǒng)的圖形構(gòu)件的API,就是說只要操作系統(tǒng)提供了相應(yīng)圖形的構(gòu)件,那么SWT只是簡單應(yīng)用JNI技術(shù)調(diào)用它們,只有那些操作系統(tǒng)中不提供的構(gòu)件,SWT才自己去做一個模擬的實現(xiàn)。另外SWT還提供對操作系統(tǒng)本地圖形用戶界面的直接訪問,因此,基于SWT的Java應(yīng)用程序擁有本地的圖形用戶界面并且可以和本地別的應(yīng)用程序和部件集成在一起。使用SWT開發(fā)包,簡單、跨平臺、可靠等這些Jaya語言本身所具有的優(yōu)點正漸漸融合到圖形界面的應(yīng)用程序開發(fā)中去。Java語言的另一扇成功之門正在逐漸打開。

          2 SWT+GtkFB的體系結(jié)構(gòu)

          2.1 SWT+GtkFB的體系結(jié)構(gòu)

          2.1.1 SWT

          SWT處于體系機構(gòu)的最上層,它與Java內(nèi)的AwT和Swing同屬于設(shè)計圖形界面所需的高級函數(shù)庫。而且SWT針對AWT 以及Swing的一些問題作了改善,如今它已發(fā)展成一套與作業(yè)系統(tǒng)無關(guān)的圖形元件函數(shù)庫。在元件的產(chǎn)生方面采用了適當(dāng)?shù)哪M,在基本的元件方面是采用原有作業(yè)系統(tǒng)的,對于較復(fù)雜的元件才用仿真的技術(shù)。基于SWT的Java應(yīng)用程序擁有本地的圖形用戶界面,并且可以和本地別的應(yīng)用程序,以及部件集成在一起。

          SWT是基于Java語言開發(fā)出來的高級圖形元件庫,如圖2所示SWT在Java端通過JNI(Java Native InteRFace)技術(shù)直接調(diào)用native端的GtkFB來使用操作系統(tǒng)的資源,JNI技術(shù)使得SWT程序可以與其他語言編寫的Native端的代碼互相協(xié)作,將它們整合在一起;另一方面可使運行在JVM(JAava虛擬機)中的SWT代碼調(diào)用GtkFB庫函數(shù)或其他程序;此外利用Invocation API,可將Java虛擬機嵌入到native端的應(yīng)用中。JNI這個接口是雙向的,相當(dāng)于橋梁和紐帶,它將SWT代碼和native端的GtkFB代碼連接起來。

          2.1.2 Gtk庫

          如圖1所示,GTK會用到幾個連接庫,如基本數(shù)據(jù)類型用的Glib庫,它是由基礎(chǔ)類、核心應(yīng)用支持類、實用功能類、數(shù)據(jù)類和對象系統(tǒng)類五個部分組成的。

          Pango是用于國際化文本的布局和顯示的全功能框架。Pango可以處理以非從左到右方向排列的文本,并且可以容易地管理復(fù)雜語言,甚至還可以處理根據(jù)使用環(huán)境而采用不同形式的信函。例如它支持雙向文本,用戶可以將從左到右的文本和從右到左的文本混合編排;還可有用于確定各種復(fù)雜文本(如阿拉伯語和泰米爾語)形狀的插件。Pango不僅僅是國際化,而且Pango庫在Xft和XRender的支持下能很好地處理抗鋸齒字體文本的顯示。

          Pango還支持各種圖形格式如libpng,libjpeg,libtiff和Framebuffer port用的FreeType等。實際上GTK提供gdk-pixbuf,gdk和gtk三個連接庫,其中Gdk-pixbuf讓我們可做相關(guān)的圖像工作,gdk是窗口繪圖系統(tǒng)的抽象層,framebuffer相關(guān)的工作大部分在此完成,而gtk則是高層的應(yīng)用程序接口。Atk(Accessibility Toolkit)可訪問性工具箱。GTK充分利用ATK使殘障人士(如視力低下或行動不便)與GTK應(yīng)用程序交互成為可能。

          2.1.3 GtkFB的工作原理

          DirectFB訪問圖形硬件設(shè)備依賴于操作系統(tǒng)提供的內(nèi)核接口,即幀緩沖設(shè)備(FrameBuffer)。FrameBuffer實際上是用一塊硬件來做顯卡和軟件之間的橋梁,的內(nèi)核將其開放出來,使用戶的程序可以通過塊內(nèi)存來存取顯卡。例如設(shè)定顯示分辨率和色彩數(shù)、存取顯示內(nèi)存區(qū)等。不同的需要提供針對不同顯示硬件FrameBuffer的驅(qū)動程序,這就是說DirectFB需要運行于FramBuffer之上,然而Linux內(nèi)核提供了常見芯片的FrameBuffer驅(qū)動。

          當(dāng)一個應(yīng)用程序連接到GtkFB時會調(diào)用gtk_init(),如圖3所示,此時GtkFB 啟動Linux的Framebiffer,設(shè)定分辨率和色彩數(shù),接下來打開鍵盤和鼠標(biāo)等外設(shè)(PDA打開按鍵和觸控屏幕).然后到特定目錄去讀取字型,最后對窗口和事件管理作初始化操作。GtkFB可以支持8、16、24、32bpp的framebuffer。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關(guān)文章:linux教程



          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();