近日高仿机大行其道
丰富的视觉效果
方便的触摸操作
成了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();
buf_ptr = med_alloc_ext_mem(GDI_LCD_WIDTH*GDI_LCD_HEIGHT*2);
if (buf_ptr == NULL)
{
//加一些错误提示
return;
}
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);
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