1. 程式人生 > >MTK 層的基礎知識筆記

MTK 層的基礎知識筆記

1.gdi_layer_clear()----將整個層刷成單一顏色(層啟用後要立即執行)。

2.gdi_layer_set_source_key()-----將某一顏色設為層的通透色,在層合併的時候,系統會自動將層與通透色相同的顏色忽略掉(就是說這一點上看到的是底下層的顏色)gdi_layer_set_source_key(TRUE,GDI_COLOR_BLUE);

3.gdi_layer_create(20,20,136,130, &my_layer);----用來建立層,其前四個引數指出層的位置及大小(位置是以實際螢幕左上角為原點的),最後一個引數時剛建立的層控制代碼地址,用以返回所建立的層。(要注意一點的是,應為建立層時系統要為其分配動態記憶體空間,而系統保留的記憶體一般只夠建立一個

UI_device_width * UI_device_height大小的層,所以如果呼叫gdi_layer_create時記憶體不足系統就會ASSERT。解決的辦法是使用函式gdi_layer_create_using_outside_memeory,即自己申請記憶體,然後作為引數傳進去建立層。

4.gdi_layer_set_active(my_layer);----任何時刻有且只能有一個層處於啟用狀態,所有的繪畫函式都是預設畫到這個層中(啟用層中),所以想要在層上繪畫必須先將其啟用。建立層並不會自動啟用,需要手動將其啟用。不過,由於在多層的處理中需要在各個層之間切換啟用,所以我們經常用到的是

gdi_layer_push_and_set_active(gdi_handle handle),此函式會把當前的啟用層入棧而啟用引數層,等到下次需要啟用棧中的層時,只需要用函式gdi_layer_pop_and_restore_active()啟用就可以了。

5.gdi_layer_get_base_handle(&base_layer);----獲取基礎層

gdi_layer_set_active(base_layer);//主動將基礎層還原為啟用狀態

gui_BLT_double_buffer(0,0,UI_device_width -1, UI_device_height -1);

6.

gui_BLT_double_buffer()----用來合併層,但在使用之前先得用gdi_layer_set_blt_layer(base_layer,my_laye,NULL,NULL);指明是哪幾個層需要合併,函式gui_BLT_double_buffer能接受四個層控制代碼,也就是說我們系統同一時刻最多能合併四個層(當然建立的層可以不止這個數)。另外要注意引數的順序,第一個傳入的層是放在最底下的,然後依次往上碼。也可以直接用函式gdi_layer_blt_(base_layer,my_laye,NULL,NULL0,0,UI_device_width -1, UI_device_height -1);進行圖層合併。效果一樣。

7.gdi_layer_set_clip(40,25, 100, 100); ---所謂剪下,就是在層中設一個限制區域,只有在這個區域中的繪畫才是有效的,否則就會被自動忽略。剪下特效有兩個特點:1,每個層一定有而且只能有一個剪下區域。2,剪下區域一經設定,永久生效。所有剪下區域用完後最後用gdi_layer_reset_clip還原(如不還原則有可能什麼東西都畫不上來)。

8.gdi_layer_set_opacity(TRUE, 128);第一個引數指明要不要開啟半透明效果,第二個引數是透明度的取值,範圍從0255,值越小表示透明度越高,當取值為0時就會完全被透掉,255即完全不透明。

9.gdi_layer_free(my_layer);---建立層需要為其分配內層空間,所以層用完後也要手動將其釋放(切記一定要釋放,否則別的程式就無法建立層了):

10.gui_lock_double_buffer();gui_unlock_double_buffer();鎖屏

11.gdi_layer_clear_background(GDI_COLOR_RED); //把背景全刷成紅色

12.剪下區的使用:使用順序:

gui_push_clip();//儲存剪下區

gui_set_clip(0, 0, MEEPOMENU_TEMP_LAYER_WIDTH - 1, MEEPOMENU_TEMP_LAYER_HEIGHT - 1);//設定剪下區

gui_pop_clip();//回覆剪下區

程式碼使用樣例:

gui_lock_double_buffer();//鎖屏

gui_push_clip();//儲存當前剪下區

gdi_layer_push_and_set_active(MeepoMenu_temp_layer_prev);//儲存當前啟用層到棧中,並激活引數(MeepoMenu_temp_layer_prev)層。

old_alpha_layer = gdi_image_abm_set_source_layer(MeepoMenu_temp_layer_prev);//設定圖片在此層上通透,並返回之前的通透層

gdi_layer_set_source_key(TRUE, GDI_COLOR_TRANSPARENT);//設定通透顏色

gdi_layer_clear_background(GDI_COLOR_BLACK);//把背景刷成黑色

gui_set_clip(0, 0, MEEPOMENU_TEMP_LAYER_WIDTH - 1, MEEPOMENU_TEMP_LAYER_HEIGHT - 1);//設定剪下區

GetMeepoMenuPageImg(meepomenu_page_prev, &img_id, &str_id);//獲取要繪製的圖片的id

gui_show_image(0, 0, (PU8) GetImage((U16) (img_id)));

gui_show_image(0, 0, (PU8) GetImage((U16) (str_id)));

gdi_layer_pop_and_restore_active();//從棧中彈出之前儲存的啟用層,並激活

if (old_alpha_layer)

{

gdi_image_abm_set_source_layer(old_alpha_layer);//重新設定通透層

}

gui_pop_clip();//彈出之前儲存的剪下區

gui_unlock_double_buffer();//解鎖