四齐遵、編程向?qū)?4.4架構(gòu)預(yù)覽)

編程向?qū)?.4架構(gòu)預(yù)覽

我們將要花費一些時間以軟件管理的角度來解釋如何設(shè)計Kivy寂玲。這將是理解每一部分如何一起工作的關(guān)鍵。你也許瀏覽過源代碼梗摇,也許有理一個粗糙的概念拓哟;但是看源代碼也許是令人生畏的,因此這節(jié)內(nèi)容將會詳細(xì)解釋一些基本的概念伶授。你可以略過本節(jié)以待日后再看断序,但我們建議你至少大致瀏覽一下。

Kivy由幾個模塊組成糜烹,下面是Kivy架構(gòu)圖:


Architectural Overview

一违诗、核心提供者和輸入提供者

理解Kivy內(nèi)部思想的關(guān)鍵是模塊化和抽象。我們試圖抽象一些基本的任務(wù)疮蹦,例如打開一個窗口诸迟、展示圖片和文本、播放音頻挚币、從攝像頭獲取圖像亮蒋、拼寫檢查等等。我們稱它們?yōu)楹诵娜蝿?wù)妆毕。這使得API既容易使用又容易擴展慎玖。更重要的是,它允許我們用:what we call笛粘,在你的應(yīng)用程序運行時的不同場景指定不同的提供者趁怔。例如湿硝,在OS X,Linux和Windows系統(tǒng)上润努,針對不同的核心任務(wù)有不同的本地APIS关斜。一方面這些APIS同操作系統(tǒng)進(jìn)行交流,另一方面我們調(diào)用的Kivy的核心提供者扮演著中間交流層的角色铺浇。使用特殊核心提供者的便利之處是我們可以充分的使用操作系統(tǒng)暴露出來的功能痢畜,盡可能的使程序運行的更高效。它給用戶提供了一個機會鳍侣。另外丁稀,通過使用那些針對一個平臺的庫,我們可以高效地較低應(yīng)用程序打包的尺寸倚聚。這也使得移植到別的平臺更容易些线衫。安卓端口從這方面就獲利巨大。

我們利用同樣的思路處理輸入提供者惑折。輸入提供者授账,支持一些特殊的輸入設(shè)備,例如蘋果的trackpads,TUIO或者鼠標(biāo)模擬器惨驶。如果你需要添加一個新的輸入設(shè)備白热,你只需要簡單的添加一個新的類來讀取你的輸入數(shù)據(jù)并且將其轉(zhuǎn)換到Kivy的基本事件。

二敞咧、圖形

Kivy的圖像接口是我們對OpenGL的抽象棘捣。在更低的層面,Kivy使用OpenGL來分發(fā)硬件加速指令休建。對于一個初學(xué)者來說乍恐,寫OpenGL代碼也許是令人迷惑的。這也是我們提供圖形API接口的原因测砂,你只需要使用簡單的封裝好的方法(例如Canvas茵烈,Rectangle等等)進(jìn)行繪畫即可。

我們的所有部件本身就是使用這些圖形接口砌些,為了更高效的表現(xiàn)呜投,它們在C語言執(zhí)行。

另外一個便利之處是這些圖形接口可以自動優(yōu)化繪畫指令存璃。如果你不是一個OpenGL的專家仑荐,這將是很有用的幫助。在很多的場景下纵东,它將使你的繪畫代碼更高效粘招。

當(dāng)然你也可以使用OpenGL命令。我們在所有的設(shè)備上使用的是OpenGL2.0(GLSE2)偎球,所以如果你想保持更好的跨平臺的兼容性洒扎,我們建議你僅僅使用GLSE2提供的函數(shù)辑甜。

三、核心

核心提供者提供了一些通用的功能袍冷,例如:

  • Clock(時鐘):你可以使用時鐘來計劃定時器事件磷醋。一次性的定時器和周期性的定時器都被支持。
  • Cache(緩存):如果你需要將你常用的一些東西緩存起來胡诗,你可以使用我們提供的緩存類邓线,而不是自己再造一個輪子。
  • Gesture Detection(手勢檢測):我們提供了一個簡單的手勢識別乃戈,你可以用來檢測不同類型的軌跡褂痰,例如圓圈或者矩形。你可以自己訓(xùn)練它來檢測自己的軌跡症虑。
  • Kivy Language(Kivy語言):Kivy語言可以容易并高效地描述用戶接口。
  • Properties(屬性):這里的屬性不是你熟知的Python里面的屬性归薛,它們是我們自己的屬性類谍憔,以用來鏈接你的部件代碼和用戶接口描述。

四主籍、UIX(部件和布局)

UIX模塊包含常用的部件和布局习贫,你可以重復(fù)使用它們來創(chuàng)建一個用戶接口。

  • Widgets:部件是用戶接口元素千元,它們有的可見苫昌,有的不可見,例如文件瀏覽窗口幸海、按鈕祟身、滑塊、列表等等物独。部件接收MotionEvents袜硫。
  • Layouts:你可以使用布局來排列部件。當(dāng)然你可以手動的自己來布局部件挡篓,但是通常使用布局會更加的方便婉陷。布局包括網(wǎng)格布局、盒子布局等官研,你也可以布局嵌套秽澳。

五、模塊

如果你曾經(jīng)使用過現(xiàn)代的網(wǎng)頁瀏覽器戏羽,并定制過一些插件担神,那么你已經(jīng)了解了關(guān)于我們模塊類的基本概念。模塊用來被注入功能到Kivy程序中蛛壳,即使原作者沒有包括它杏瞻。

一個例子展示了一個總是顯示FPS的模塊和一些描繪FPS的圖表所刀。

你也可以寫自己的模塊。

六捞挥、輸入事件(觸摸)

Kivy抽象了不同的輸入類型和資源浮创,例如觸摸、鼠標(biāo)砌函、TUIO等等斩披。所有這些輸入類型的共同之處是你可以使用一個屏幕上的2D坐標(biāo)以及一些特殊的輸入事件關(guān)聯(lián)起來。(一些其它的輸入設(shè)備讹俊,例如加速器你就不能簡單的使用2D坐標(biāo)來描述垦沉。這類輸入設(shè)備被分別對待)

所有的這些輸入設(shè)備類型被Touch()類的實例來表示。(注意這不僅僅代表手指觸摸仍劈,也同樣表示別的輸入類型厕倍。我們只是因為類似而采取了Touch的名字。)一個Touch的實例或?qū)ο蠓犯恚齻€狀態(tài)讹弯,當(dāng)一個觸摸進(jìn)入到了這些狀態(tài),你的程序被通知这溅,該事件發(fā)生了组民。這三個狀態(tài)如下:

  • Down:一個觸摸被按下一次
  • Move:A touch can be in this state for a potentially unlimited time. A touch does not have to be in this state during its lifetime. (一個觸摸可能在一個潛在的無限的時間里。一個觸摸在它的生命周期中不會一直在這個狀態(tài)悲靴。)當(dāng)一個觸摸的2D坐標(biāo)發(fā)生改變時臭胜,Move將會事件發(fā)生。

gthank:前面的兩句話不知道什么意思癞尚!

  • Up:一個觸摸抬起至多一次或沒有耸三。實際應(yīng)用中,你將總會接收到一個Up事件否纬,因為沒有人會永遠(yuǎn)將一個手指放在屏幕上吕晌,但是這不是有保證的。如果你知道用戶正在使用的輸入源临燃,你將會知道是否依賴這個狀態(tài)睛驳。

七、部件和事件發(fā)送

部件這個術(shù)語通常用在GUI編程中膜廊,來描述和用戶交互的那部分程序乏沸。在Kivy中,一個部件是一個對象由來接收輸入事件爪瓜。在屏幕上有一個可視的代表是沒有必要的蹬跃。所有的部件在一個部件樹中管理:一個部件能有零或者多個子部件。但是在樹的頂端只能有一個根部件铆铆,根部件沒有父部件蝶缀;其它的部件直接或間接的是根部件的子部件丹喻。

當(dāng)一個新的輸入數(shù)據(jù)可用時,Kivy發(fā)送一個事件翁都。根部件首先收到該事件碍论。根據(jù)觸摸的狀態(tài),on_touch_down, on_touch_move, on_touch_up事件被發(fā)送到根部件柄慰,這將導(dǎo)致在根部件中相應(yīng)的事件處理函數(shù)被調(diào)用鳍悠。

在樹中的每一個部件能選擇吸收或傳遞事件。如果一個事件處理函數(shù)返回True坐搔,這意味著這個事件被吸收并正確的處理藏研,對于該事件,沒有進(jìn)一步的處理會發(fā)生概行。否則蠢挡,這個事件處理函數(shù)通過調(diào)用它的父類的各自事件處理函數(shù)的實現(xiàn),傳遞部件到它自己的子部件上凳忙。最終事件傳遞到部件的基類袒哥,在它的事件處理函數(shù)里,什么到不做消略,僅僅傳遞touchs到它的子部件。

#這是一個move/up的模擬
def on_touch_down(self, touch):
    for child in self.children[:]:
        if(child.dispatch('on_touch_down', touch)):
            return True

它可能比看起來更容易瞎抛。下面的章節(jié)會展示一個例子艺演,漂亮的應(yīng)用程序能夠快速的被創(chuàng)建。

通常你想限制一個部件監(jiān)聽觸摸事件的屏幕區(qū)域桐臊。你可以使用部件的collide_point()方法來做到這點胎撤。你傳遞給它觸摸的坐標(biāo),并且它將返回監(jiān)聽的區(qū)域断凶。默認(rèn)情況下伤提,屏幕上矩形區(qū)域的檢測使用部件的坐標(biāo)和尺寸來描述,但是你也能在自己的類中進(jìn)行重載认烁。

下節(jié)預(yù)告:編程向?qū)?.5事件和屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肿男,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子却嗡,更是在濱河造成了極大的恐慌舶沛,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窗价,死亡現(xiàn)場離奇詭異如庭,居然都是意外死亡,警方通過查閱死者的電腦和手機撼港,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門坪它,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骤竹,“玉大人,你說我怎么就攤上這事往毡∶纱В” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵卖擅,是天一觀的道長鸣奔。 經(jīng)常有香客問我,道長惩阶,這世上最難降的妖魔是什么挎狸? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮断楷,結(jié)果婚禮上锨匆,老公的妹妹穿的比我還像新娘。我一直安慰自己冬筒,他們只是感情好恐锣,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舞痰,像睡著了一般土榴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上响牛,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天玷禽,我揣著相機與錄音,去河邊找鬼呀打。 笑死矢赁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贬丛。 我是一名探鬼主播撩银,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豺憔!你這毒婦竟也來了额获?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤焕阿,失蹤者是張志新(化名)和其女友劉穎咪啡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暮屡,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡撤摸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片准夷。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡钥飞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衫嵌,到底是詐尸還是另有隱情读宙,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布楔绞,位于F島的核電站结闸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酒朵。R本人自食惡果不足惜桦锄,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔫耽。 院中可真熱鬧结耀,春花似錦、人聲如沸匙铡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳖眼。三九已至黑毅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钦讳,已是汗流浹背博肋。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜂厅,地道東北人。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓膊畴,卻偏偏與公主長得像掘猿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子唇跨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,854評論 25 707
  • 編程向?qū)?.6輸入管理 一买猖、輸入架構(gòu) Kivy能處理很多類型的輸入:鼠標(biāo)改橘、觸摸屏、加速器玉控、陀螺儀等等飞主。它在下列的平...
    gthank閱讀 674評論 0 0
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 頁面打開順序:A → B A B
    雨聲不吃魚閱讀 4,470評論 0 0
  • 靜靜地畫完碌识,天黑了碾篡,肚肚也餓了起來!
    碧萱angel閱讀 183評論 4 3