解析MTK層一些函數(shù)及應(yīng)用
MTK層一些函數(shù)及應(yīng)用是本文要介紹的內(nèi)容,MTK 的層在窗口設(shè)計(jì)中應(yīng)用十分廣泛,對(duì)于UI來說,沒有一個(gè)窗口不是由層構(gòu)成的,最基本的窗口至少也是在基層上設(shè)計(jì)的。以至于許多時(shí)候,如果對(duì)層不甚了解,連閱讀代碼有時(shí)也會(huì)遇到困難。我曾經(jīng)寫過一些有關(guān)層的使用的基礎(chǔ)知識(shí),由于有關(guān)這方面資料很少,許多時(shí)候只能在模擬器上打斷點(diǎn)自己慢慢研究。
MTK層可以在模擬器中調(diào)試,在模擬器上的TOOL菜單中的Info Monitor功能窗口,可以看到當(dāng)前窗口由哪些層和各個(gè)層顯示的內(nèi)容,但不包括你雖然創(chuàng)建了,但沒有調(diào)用函數(shù)gdi_layer_blt或者與他gdi_layer_blt相類似函數(shù)刷到窗口上的層。
處理PNG有關(guān)的函數(shù)
- gdi_push_and_set_alpha_blending_source_layer
- gdi_pop_and_set_alpha_blending_source_layer
- gdi_set_alpha_blending_source_layer
- gdi_get_alpha_blending_source_layer
這一組函數(shù)是在層上繪制PNG圖片時(shí)使用,是PNG函數(shù)的專用函數(shù),可以有效還原PNG圖片的效果,前兩個(gè)函數(shù)是成對(duì)使用,后一個(gè)函數(shù)作用同前兩個(gè),但使用上更自由一些,如果超過兩個(gè)層,每個(gè)層都要畫PNG,無疑使用gdi_set_alpha_blending_source_layer更加方便。最后一個(gè)是獲取BLENDING層。
設(shè)置層的位置
- gdi_layer_set_position
如果層上的數(shù)據(jù)是經(jīng)過十分復(fù)雜的運(yùn)算過程得出來的,比如要在IDLE上顯示一個(gè)可以使用手指移動(dòng)的農(nóng)歷是日歷,這時(shí)就可以在層上畫好要顯示的數(shù)據(jù),通話移動(dòng)層的位置實(shí)現(xiàn)移動(dòng)效果,要比每次重繪日歷要快捷的多。
合并到BASE層
- gdi_layer_flatten_previous_to_base
類似的函數(shù)還有
- gdi_layer_flatten
前者是把當(dāng)前窗口數(shù)據(jù)合并到基層,后者是把指定的層合的激活層上,該函數(shù)常常在退出窗口時(shí)使用,如果你見有些窗口在彈出對(duì)話框時(shí)該窗口背景突然消失,那大約就是因?yàn)槲词褂迷摵瘮?shù)的原因。因?yàn)镸TK的很多窗口都不是單一層,更關(guān)鍵的是在創(chuàng)建新窗口時(shí)有時(shí)會(huì)釋放老窗口的層資源,導(dǎo)到在老窗口非基層的顯示數(shù)據(jù)丟失。該函數(shù)使用我們可以使用超過四個(gè)層來創(chuàng)建更為復(fù)雜的效果。
添加DM層
- dm_add_blt_layer
有時(shí)你創(chuàng)建了層,激活了層,在層上也繪上了圖片,也調(diào)用刷屏函數(shù)了,但你總是看不到屏上顯示你的層,在模擬器中的Info Monitor窗口也看不到你的層,有時(shí)是你的層閃了一下就沒影了,這時(shí)你就要研究dm_redraw_category_screen了,該函數(shù)做為大部分窗口的刷新函數(shù),當(dāng)窗口有變化時(shí),就會(huì)執(zhí)行該函數(shù),而該函數(shù)中有一段類似如下的函數(shù)調(diào)用:
- gdi_layer_blt(
- dm_layers[0],
- dm_layers[1],
- dm_layers[2],
- dm_layers[3],
- dm_cat_scr_info.x1,
- dm_cat_scr_info.y1,
- dm_cat_scr_info.x2 - dm_cat_scr_info.x1 - 1,
- dm_cat_scr_info.y2 - dm_cat_scr_info.y1 - 1);
該調(diào)用會(huì)重新刷屏,很遺憾的是,你新創(chuàng)建的層不在數(shù)組dm_layers中,也就不在他刷新的范圍內(nèi)。要么調(diào)用dm_add_blt_layer把你的層加入,要么在dm_redraw_category_screen之后再把你自己的層刷到屏上。
使用外部內(nèi)存創(chuàng)建層med_alloc_ext_mem當(dāng)然類似函數(shù)也有很多,如mmi_frm_scrmem_alloc
確切的說,這兩個(gè)函數(shù)都不能算是LAYER的函數(shù),但如果你要使gdi_layer_create_using_outside_memory創(chuàng)建層,卻少不了這兩個(gè)函數(shù)。在這兩個(gè)函數(shù)中,我們常常調(diào)用med_alloc_ext_mem來分配內(nèi)存,是因?yàn)樵摵瘮?shù)能提供大約400K左右內(nèi)存可供調(diào)用,而 mmi_frm_scrmem_alloc可以提供200~300K內(nèi)存可供調(diào)用。但隨著MTK手機(jī)淪為SP賺錢工具后,使用 med_alloc_ext_mem分配內(nèi)存越來越不安全。在之前的一次設(shè)計(jì)中,出了問題,多虧公司一高手指點(diǎn),才消滅了這一處使用的隱患。
保存層到文件
- gdi_layer_save_jpeg_file
- gdi_layer_save_pbm_file
- gdi_layer_save_bmp_file
小結(jié):解析MTK層一些函數(shù)及應(yīng)用的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!