青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

專注于服務器編程、網絡編程

~~保持一顆平常心~~持之以恒~~
posts - 18, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

mtk mmi相關 摘抄自別人

Posted on 2009-12-18 21:57 ~William~ 閱讀(999) 評論(0)  編輯 收藏 引用 所屬分類: MTK_MMI
MTK層相關應用集合(摘抄)
2009-11-30 17:58

對于層,有個核心理念:代表屏幕上像素點陣的數據集合

一般來說,MTK上一個像素由兩個字節表示

 

 

 

一,mtk平臺上旋轉圖像的代碼,可以任意角度旋轉。

void gdi_image_Rotate_Slope(double x,double y ,double dx ,double dy ,U16 IMAGE_ID,double cosn,double sinn)
{
S32 i,
j,
n,
imge_width,
imge_width2,
imge_height,
imge_height2,
transit_layer_buff_size1,
transit_layer_buff_size2;
U16* transit_layer_buff_ptr1,
* transit_layer_buff_ptr2;
U16 a,r,g,b;
gdi_handle      transit_layer1,transit_layer2,last_active_layer;
S32 j2,i2;
double wb,x0,y0,x1,y1,u,v;

gdi_layer_multi_layer_enable();

gdi_image_get_dimension_id(IMAGE_ID,&imge_width,&imge_height);
transit_layer_buff_size1=((imge_width)*(imge_height)*16)>>3;
transit_layer_buff_ptr1=(U16*)mmi_frm_scrmem_alloc(transit_layer_buff_size1);
gdi_layer_create_using_outside_memory(0,0,imge_width,imge_height,&transit_layer1,(PU8)transit_layer_buff_ptr1,transit_layer_buff_size1);
gdi_layer_push_and_set_active(transit_layer1);
gdi_layer_clear(GDI_COLOR_BLUE);
gdi_layer_set_source_key(TRUE, GDI_COLOR_BLUE);
gdi_image_draw_id(0,0,IMAGE_ID);
gdi_layer_pop_and_restore_active();

imge_width2=240;
imge_height2=320;
transit_layer_buff_size2=(imge_width2*imge_height2*16)>>3;
transit_layer_buff_ptr2=(U16*)mmi_frm_scrmem_alloc(transit_layer_buff_size2);
gdi_layer_create_using_outside_memory(0,0,imge_width2,imge_height2,&transit_layer2,(PU8)transit_layer_buff_ptr2,transit_layer_buff_size2);
gdi_layer_push_and_set_active(transit_layer2);
gdi_layer_clear(GDI_COLOR_BLUE);
gdi_layer_set_source_key(TRUE, GDI_COLOR_BLUE);


for(i=0;i<imge_height2;i++)
{
for(j=0;j<imge_width2;j++)
   {
   x0=((double)j-x)*cosn+((double)i-y)*sinn+dx;
   y0=((double)i-y)*cosn-((double)j-x)*sinn+dy;
   //x0=(j-x)*cosn+(i-y)*sinn;
   //y0=imge_height+(i-y)*cosn-(j-x)*sinn;
   j2=(S32)x0;
   i2=(S32)y0;

   if((i2<(imge_height-1))&&(j2<(imge_width-1))&&(i2>0)&&(j2>0))
    {

    v=y0-i2;
    u=x0-j2;
    if(u>0.5)
     j2++;
    if(v>0.5)
     i2++;
    *(transit_layer_buff_ptr2+(i)*imge_width2+j) = *(transit_layer_buff_ptr1+i2*imge_width+j2);

   }
   }
}

gdi_layer_pop_and_restore_active();
gdi_layer_get_active(&last_active_layer);
gdi_layer_flatten(last_active_layer,transit_layer2,NULL,NULL);
//gdi_layer_set_blt_layer(last_active_layer,transit_layer2,NULL,NULL);
gdi_layer_free(transit_layer1);
gdi_layer_free(transit_layer2);
mmi_frm_scrmem_free(transit_layer_buff_ptr1);
mmi_frm_scrmem_free(transit_layer_buff_ptr2);
gdi_layer_multi_layer_disable();
}


二,近日高仿機大行其道,豐富的視覺效果,方便的觸摸操作成了MMI設計和模仿的重中之中
當人們在盡情享受這種創意帶來的便利的同時MMI工作者卻不得不去設計維護一個個功能越來越復雜,
界面越來越炫麗的令人頭痛的窗口,沒有別的辦法,稍一失誤,就能導到整個窗口界面凌亂,功能失效,
最終使程序員不得不不把大量的時間和精力花在令人頭痛的界面維護中,在那些復雜的代碼中尋找著可能的BUG層的運用也許是解決界面刷新,復雜界面的堆疊,代碼維護最好的方法

近日有不少朋友和我討論層的使用,而MTK有關這方面的資料也確實比較少,少數幾個掌握了的人又視之如珍寶不愿輕易示人,這里舉一個簡單的例子說明層的創建和運用,在這里我們創建兩個層,加上基層一共三個,基層作為背景層,MTK最多支持四個層合成,層的創建最好放在窗口里或者窗口控件里,在退出窗口時釋放,要不會出問題的。,當然在別的地方創建也是可以的,但要注意不能是窗口需要頻繁調用的函數,因為每次創建窗口都要分配內存,頻繁調用會導致內存耗盡,退出時切記釋放。該代碼省略了一些與層無關的內容,比如按按鍵處理,觸屏處理,請知悉
gdi_handle my_layer1, my_layer2, my_base_layer;
PU8 buf_ptr;
void exit_myapp_screen(void)
{
    if (buf_ptr != NULL)
    {
        med_free_ext_mem((void **)&buf_ptr);
    }
    if (my_layer1 != NULL)
    {
        gdi_layer_free(my_layer1);
    }
    if (my_layer2 != NULL)
    {
        gdi_layer_free(my_layer2);
    }
}
static void entry_myapp_screen(void)
{
    U8 *gui_buffer;
    BOOL isEnable;
    gdi_color base_color;

    EntryNewScreen (SCR_ID_XXXX,exit_myapp_screen,entry_myapp_screen, NULL);

    gui_buffer = GetCurrGuiBuffer(SCR_ID_XXXX);
    //設置窗口不帶狀態欄
    entry_full_screen();
    //開啟多層
    gdi_layer_multi_layer_enable();

    /*該處的2等于((GDI_LCD_WIDTH*GDI_LCD_HEIGHT*GDI_MAINLCD_BIT_PER_PIXEL)>>3)
    一個像素使用2個字節表示,即65536色*/
      buf_ptr = med_alloc_ext_mem(GDI_LCD_WIDTH*GDI_LCD_HEIGHT*2);
    if (buf_ptr == NULL)
    {
    //加一些錯誤提示
        return;
    }
    /*從外部內存創建窗口,因為MTK提供的直接創建函數只能創建
    一個層和屏幕大小一樣的層*/
    gdi_layer_create_using_outside_memory(
                                            0,
                                            0,
                                            UI_device_width,
                                            UI_device_height,
                                            &my_layer1,
                                            (PU8) buf_ptr,
                                            (S32) GDI_LCD_WIDTH*GDI_LCD_HEIGHT*2);
    //激活新層1
    gdi_layer_set_active(my_layer1);
    //把背景全刷成紅色
    gdi_layer_clear_background(GDI_COLOR_RED);
    //設置紅色為通透色
    gdi_layer_set_source_key(TRUE, GDI_COLOR_RED);
       /*在層1上畫圖,位置是相對層的位置,因為層大小和基層一樣,
       且原點和基層重合,故該座標也是相對屏幕原點的位置*/
    gdi_image_draw_id(50, 100, IMG_ID_PHOART_ICON_6);
       //創建層2,使用系統提供的直接創建函數從層內存直接創建
    gdi_layer_create(0, 0, UI_device_width, UI_device_height, &my_layer2);
    //激活新層2
    gdi_layer_set_active(my_layer2);
    gdi_layer_clear_background(GDI_COLOR_TRANSPARENT);//刷色
    gdi_layer_set_source_key(TRUE, GDI_COLOR_TRANSPARENT);//設置通透
    //在層2上輸出字串
    gui_move_text_cursor(50, 200);
    gui_print_bordered_text(L"hellow word");

    //在最后要激活基層
       gdi_layer_get_base_handle(&my_base_layer);
    gdi_layer_set_active(my_layer1);
    //得到當前活動層的通透屬性
    gdi_layer_get_source_key(&isEnable, &base_color);
    //設置通透
    gdi_layer_set_source_key(TRUE, base_color);
    //指定合并層,注意疊加的順序
    gdi_layer_set_blt_layer(my_base_layer, my_layer1, my_layer2, 0);
    //刷新到屏幕上
    gdi_layer_blt_previous(0, 0, UI_device_width - 1, UI_device_height - 1);
}

有關gdi_layer_create函數再說明一點,如果你通過這個函數創建的層大小比屏幕小,倒是可以創建多個的,但你所創建的層大小的總和,不能超過屏幕大小
還有一點需要注意的是,如果程序運行在仿真上,最好使用MALLOC和FREE替換med_alloc_ext_mem和med_free_ext_mem,也就是寫成

#ifdef WIN32
malloc
#else
med_alloc_ext_mem
#endif


#ifdef WIN32
free
#else
med_free_ext_mem
#endif

三,對于MTK平臺來說,菜單和屏幕特效曾經在很長的一段時間里,影響甚遠。但對于其設計過程和方法,由于各種各樣的原因,很少有人提及。

這里介紹一種不同于前幾天日志所載之方法的另一種方法,就是復制圖層,其核心實現函數如下。

void my_gdi_layer_copy(gdi_layer_struct* dst_layer, int dst_x, int dst_y, int width, int height,
gdi_layer_struct* src_layer, int src_x, int src_y)
{
U16 *dst_buf, *src_buf;
int i;

if (dst_x < 0 || dst_y < 0 || dst_x + width > dst_layer->width || dst_y + height > dst_layer->height)
{
if (dst_x < 0)
{
   width -= -dst_x;
   src_x += -dst_x;
   dst_x = 0;
}
if (dst_y < 0)
{
   height -= -dst_y;
   src_y += -dst_y;
   dst_y = 0;
}
if (dst_x + width > dst_layer->width)
{
   width = dst_layer->width - dst_x;
}
if (dst_y + height > dst_layer->height)
{
   height = dst_layer->height - dst_y;
}
}
if (src_x < 0 || src_y < 0 || src_x + width > src_layer->width || src_y + height > src_layer->height)
{
if (src_x < 0)
{
   width -= -src_x;
   dst_x += -src_x;
   src_x = 0;
}
if (src_y < 0)
{
   height -= -src_y;
   dst_y += -src_y;
   src_y = 0;
}
if (src_x + width > src_layer->width)
{
   width = src_layer->width - src_x;
}
if (src_y + height > src_layer->height)
{
   height = src_layer->height - src_y;
}
}
if (width <= 0 || height <= 0)
return;

dst_buf = (U16 *)dst_layer->buf_ptr + dst_y * dst_layer->width + dst_x;
src_buf = (U16 *)src_layer->buf_ptr + src_y * src_layer->width + src_x;
for (i = 0; i < height; i ++)
{
memcpy(dst_buf, src_buf, width * 2);
dst_buf += dst_layer->width;
src_buf += src_layer->width;
}
}

有興趣的朋友可以自己利用該函數研發各種各樣的變化效果。

 

 

四,MTK 的層在窗口設計中應用十分廣泛,對于UI來說,沒有一個窗口不是由層構成的,最基本的窗口至少也是在基層上設計的。以至于許多時候,如果對層不甚了解,連閱讀代碼有時也會遇到困難。我曾經寫過一些有關層的使用的基礎知識,由于有關這方面資料很少,許多時候只能在模擬器上打斷點自己慢慢研究。

層可以在模擬器中調試,在模擬器上的TOOL菜單中的Info Monitor功能窗口,可以看到當前窗口由哪些層和各個層顯示的內容,但不包括你雖然創建了,但沒有調用函數gdi_layer_blt或者與他gdi_layer_blt相類似函數刷到窗口上的層。

處理PNG有關的函數
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
這一組函數是在層上繪制PNG圖片時使用,是PNG函數的專用函數,可以有效還原PNG圖片的效果,前兩個函數是成對使用,后一個函數作用同前兩個,但使用上更自由一些,如果超過兩個層,每個層都要畫PNG,無疑使用gdi_set_alpha_blending_source_layer更加方便。最后一個是獲取BLENDING層。

設置層的位置
gdi_layer_set_position
如果層上的數據是經過十分復雜的運算過程得出來的,比如要在IDLE上顯示一個可以使用手指移動的農歷是日歷,這時就可以在層上畫好要顯示的數據,通話移動層的位置實現移動效果,要比每次重繪日歷要快捷的多。

合并到BASE層
gdi_layer_flatten_previous_to_base
類似的函數還有
gdi_layer_flatten
前者是把當前窗口數據合并到基層,后者是把指定的層合的激活層上,該函數常常在退出窗口時使用,如果你見有些窗口在彈出對話框時該窗口背景突然消失,那大約就是因為未使用該函數的原因。因為MTK的很多窗口都不是單一層,更關鍵的是在創建新窗口時有時會釋放老窗口的層資源,導到在老窗口非基層的顯示數據丟失。該函數使用我們可以使用超過四個層來創建更為復雜的效果。

添加DM層
dm_add_blt_layer
有時你創建了層,激活了層,在層上也繪上了圖片,也調用刷屏函數了,但你總是看不到屏上顯示你的層,在模擬器中的Info Monitor窗口也看不到你的層,有時是你的層閃了一下就沒影了,這時你就要研究dm_redraw_category_screen了,該函數做為大部分窗口的刷新函數,當窗口有變化時,就會執行該函數,而該函數中有一段類似如下的函數調用:
            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);
該調用會重新刷屏,很遺憾的是,你新創建的層不在數組dm_layers中,也就不在他刷新的范圍內。要么調用dm_add_blt_layer把你的層加入,要么在dm_redraw_category_screen之后再把你自己的層刷到屏上。

使用外部內存創建層med_alloc_ext_mem當然類似函數也有很多,如mmi_frm_scrmem_alloc
確切的說,這兩個函數都不能算是LAYER的函數,但如果你要使gdi_layer_create_using_outside_memory創建層,卻少不了這兩個函數。在這兩個函數中,我們常常調用med_alloc_ext_mem來分配內存,是因為該函數能提供大約400K左右內存可供調用,而 mmi_frm_scrmem_alloc可以提供200~300K內存可供調用。但隨著MTK手機淪為SP賺錢工具后,使用 med_alloc_ext_mem分配內存越來越不安全。在之前的一次設計中,出了問題,多虧公司一高手指點,才消滅了這一處使用的隱患。

保存層到文件
gdi_layer_save_jpeg_file
gdi_layer_save_pbm_file
gdi_layer_save_bmp_file

還有一類函數,設計窗口時可以處理層,但卻不屬于層函數,見一個同事使用,順手拉來,以防忘記
dm_register_category_controlled_callback
dm_register_category_controlled2_callback
該函數會為創建的層指定繪定函數,并且這兩個函數只能分別處理DM管理的層,DM管理的層及相關控件可以在結構 mmi_dm_control_ids_enum找到,這兩個函數可以在DM指定的層上繪圖,既可以處理不同的層,也可以處理相同的層,如果不同的層,可以定義在g_categories_controls_map中的control_set_p中定義如下,control_set_p中一般會包含基層,有時也包含新層,定義如下格式
const U8 categoryXXXX[] =
{
    4,
    DM_BASE_LAYER_START,
    DM_CATEGORY_CONTROLLED_AREA,
    DM_NEW_LAYER_START,
    DM_CATEGORY_CONTROLLED_AREA2,
};但是在該結構中只能定義兩個層,如果你想創建第三個層并使用DM管理,就要使用上面提到的dm_add_blt_layer,層的處理函數也要自己寫,維護。

刷屏函數
gdi_layer_blt_previous
gui_BLT_double_buffer
gdi_layer_blt
gdi_layer_set_blt_layer
前三個函數都是刷屏函數,前兩個功能一模一樣,只能指定刷新的區域,使用前需要用第四個函數指定參與操作的層。第三個可以自己指定要刷到屏的層和區域。需要說明的是,執行gui_BLT_double_buffer和執行gdi_layer_blt_previous不僅效果一樣,執行過程也是一樣的,gui_BLT_double_buffer只是個函數指針,指向gdi_layer_blt_previous,調用他最后執行的仍然是 gdi_layer_blt_previous

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久国产毛片| 欧美福利网址| 久久福利视频导航| 亚洲精品三级| 欧美大片免费看| 亚洲国产综合视频在线观看| 久久精品视频99| 亚洲在线观看| 国产精品久久久久高潮| 夜夜嗨av一区二区三区网页| 国产一区二区在线观看免费播放| 欧美日韩一区在线播放| 在线成人中文字幕| 久久人人爽人人| 欧美在线观看你懂的| 国产精品影片在线观看| 亚洲欧美国内爽妇网| 夜夜嗨av一区二区三区中文字幕 | 99精品视频一区| 免费试看一区| 亚洲三级视频在线观看| 亚洲国产一区视频| 欧美**人妖| 日韩一二三区视频| 一区二区三区国产盗摄| 欧美黄网免费在线观看| 夜夜狂射影院欧美极品| 日韩亚洲一区在线播放| 欧美日韩一区二区在线播放| 亚洲免费小视频| 亚洲欧美在线免费| 国产亚洲精品久久久久婷婷瑜伽| 久久久久久9| 免费在线观看一区二区| 亚洲人成人99网站| 99在线精品观看| 国产毛片久久| 亚洲大胆av| 欧美日韩一区免费| 久久夜精品va视频免费观看| 欧美福利视频网站| 欧美亚洲日本网站| 久久躁狠狠躁夜夜爽| 在线一区二区日韩| 久久高清福利视频| 一区二区三区欧美在线| 欧美一区二区大片| 9久re热视频在线精品| 欧美一区二区免费视频| 亚洲国产一区二区三区高清| aa级大片欧美| 在线观看日产精品| 一区二区三区四区五区在线| 亚洲电影av| 亚洲午夜精品一区二区三区他趣 | 蜜臀久久99精品久久久画质超高清 | 久久久久久久一区| 欧美电影免费观看| 亚洲欧洲99久久| 免费成人美女女| 久久成人18免费网站| 欧美黄色一区二区| 久久久在线视频| 欧美午夜精品久久久久久久| 欧美国产日韩视频| 国产在线观看一区| 亚洲无线观看| 国产一区二区精品久久| 亚洲欧洲三级| 欧美自拍偷拍| 亚洲欧美日韩中文在线制服| 麻豆精品视频在线观看| 久久精品夜色噜噜亚洲a∨| 欧美日韩在线播放| 亚洲激情国产| 亚洲国产精品一区二区三区| 亚洲欧美怡红院| 亚洲女ⅴideoshd黑人| 欧美高清一区| 欧美成人中文| 亚洲黑丝一区二区| 久久亚洲影院| 麻豆精品国产91久久久久久| 国产精品婷婷午夜在线观看| 在线亚洲一区二区| 免费在线观看成人av| 欧美在线视频一区二区三区| 国产精品国产一区二区| 91久久在线| 亚洲精品中文字| 欧美大片一区二区三区| 亚洲国产精品va在线看黑人动漫| 亚洲第一精品影视| 久久亚洲国产精品日日av夜夜| 久久裸体视频| 尤物视频一区二区| 玖玖视频精品| 亚洲黄色在线观看| 一本久道久久久| 国产精品大片wwwwww| 亚洲午夜小视频| 欧美在线网站| 在线观看日韩av电影| 欧美国产1区2区| 亚洲美女在线观看| 欧美亚洲免费| 亚洲大胆av| 欧美日韩国产限制| 国产精品99久久久久久白浆小说| 午夜一区在线| 亚洲第一福利在线观看| 欧美精品一区三区| 亚洲一区二区三区在线视频| 久久久欧美精品sm网站| 亚洲欧洲综合| 欧美性猛交xxxx免费看久久久 | 欧美伦理视频网站| 亚洲天堂男人| 久久伊人精品天天| 99视频超级精品| 国产麻豆综合| 欧美电影电视剧在线观看| 一本色道久久综合亚洲精品按摩| 久久黄色网页| 99这里只有精品| 国产一区免费视频| 欧美激情按摩在线| 亚洲欧美日韩精品久久亚洲区| 欧美国产一区二区在线观看| 亚洲一区在线观看视频| 影音先锋国产精品| 欧美黑人国产人伦爽爽爽| 一区二区三区高清在线观看| 国产一区二区三区久久精品| 欧美伦理91i| 久久亚洲免费| 日韩小视频在线观看专区| 久久狠狠亚洲综合| 亚洲六月丁香色婷婷综合久久| 久久精品国产清自在天天线| 日韩午夜电影av| 影音先锋日韩资源| 国产精品久久久久一区二区三区共 | 中日韩午夜理伦电影免费| 久久综合激情| 中文在线不卡| 91久久在线| 韩日欧美一区二区| 国产精品美女一区二区| 欧美电影美腿模特1979在线看 | 国产精品国产三级国产aⅴ入口 | 亚洲特级毛片| 91久久精品美女| 麻豆精品91| 久久丁香综合五月国产三级网站| 日韩一区二区精品| 91久久线看在观草草青青| 国产一区二区高清| 国产精品国产自产拍高清av| 欧美精品色综合| 欧美成人激情视频| 麻豆亚洲精品| 久久久久免费| 欧美亚洲在线观看| 亚洲制服欧美中文字幕中文字幕| 亚洲人体影院| 亚洲激精日韩激精欧美精品| 免费观看在线综合| 久久久亚洲国产天美传媒修理工| 欧美日韩国内| 欧美不卡在线| 欧美国产日韩a欧美在线观看| 久久综合精品一区| 久久久久久久网| 久久久999精品免费| 久久se精品一区精品二区| 先锋资源久久| 久久精品日韩| 久久久女女女女999久久| 久久久久久穴| 免费视频亚洲| 欧美日韩大片| 国产精品高潮久久| 国产欧美日韩一级| 激情六月综合| 亚洲精品影院在线观看| 亚洲美女少妇无套啪啪呻吟| 日韩一级裸体免费视频| 亚洲手机在线| 久久国产精彩视频| 欧美~级网站不卡| 亚洲国产裸拍裸体视频在线观看乱了| 欧美高清你懂得| 亚洲精品视频免费| 亚洲视频在线二区| 亚洲欧美日韩在线高清直播| 久久精品一区| 欧美美女bbbb| 国产日韩欧美高清免费| 亚洲私人影院|