MTK复习笔记二

MTK的GUI系统还是有点意思的。其GUI一共分为三层。最底层为GDI库以及Pixtel库。中间一层为GUI层,提供基本的控件以及显示操作。最上一层为WGUI层,该层包含许多窗口模板,例如Category Screen。还包含了Draw Manager,以及Touch Screen。Touch Screen是一个比较特殊的存在。早期的MTK的GUI的触摸区域是以焦点控件来触发的,而现今大部分的触屏应用越来越丰富,而且触摸行为不定,故此不能再以过去的方式,故而新增加了Touch Screen专门来处理触屏事件。

GUI层,主要处理图形绘画(一些基本图形,如圆形,长方形等),图像显示(绘制各种格式图像),文本(文字的输出显示),填充(图形与图像的结合,或纯色的填充),控件(只负责控件的绘制,不负责交互)。GDI层,主要是调用硬件的方式来处理图形绘制,图像绘制,字体管理,以及LCD图层的管理。在MTK中,GUI与GDI有部分重叠,所以在设计代码的时候,有时候会跨越GUI层而直接用GDI的现象。MTK的GUI中采用了图层技术,图层的技术,主要是为了增强系统对于GUI特效的使用,以及显示速度的提升。对于屏幕中静态的元素(即不动以及不变的)绘画到一个缓存里面,把相对变化的元素画到另外一个缓存里面,当系统需要更新屏幕的时候,再把两个缓存叠加输出,这样的速度会大大的提升,因为其减少了一些重复元素的绘制过程。这里的缓存就是层的概念,MTK中层的叠加甚至会用到硬件加速,故此对于半透,精灵等特效的实现,都可以利用层的特色来完成。一般创建层的方法都是采用GDI接口(gdi_layer_create接口),但有一点要注意的是,创建层是需要消耗大量内存的,采用gdi_create_layer是消耗系统内存(一般情况下只能创建一到两层),如果需要用到多层,则采用gdi_layer_create_using_outside_memory接口,此时就可以申请用户空间的内存来创建图层。在运用图层的时候,任何时刻,只有一个图层是属于激活状态(也就是说此时所有的GDI以及GUI绘图操作都是在此图层上进行的),其余的图层都是未激活状态。系统有一个叫做基础图层,该图层与硬件屏幕的大小一致,而且在系统创建时候即创建。该图层在每次进入新窗口的时候,都会自动的变成激活状态。同一时刻,最多能合并四个层,一般由gdi_layer_set_blt_layer来指定哪些层合并,而且层作为参数的顺序决定了层的叠加顺序。第一个参数是放在最底层,最后一个参数是放在最上层。图层的合并可以调用两个函数:gui_BLT_double_buffer或则gdi_layer_blt。在引入图层系统后,图形以及图像等绘画的坐标系,不再以硬件屏幕的左上角为起点,而是以图层的左上角为起点。故此,在图层绘制的时候,图形的左上角位置必须减去图层左上角在屏幕的坐标来使图形能在图层上正确的显示。图层的透明处理,必须先把图层刷成一个纯色,然后指定该纯色为透明色,则图层就变成了透明图层。图层要实现一定程度的通透效果,可以通过gdi_layer_set_opacity来设置通透的程度(0完全透明,255不透明)。在图层上绘画,还必须注意有效区域的设置,有效区域的设置是一直生效的,故此每次设置以后,使用完毕后,最好Reset一下(gdi_layer_reset_clip)。最为重要的一点是,图层在使用完毕后,记得一定要释放图层。调用gdi_layer_free函数。有时候,在某些函数中,也许会有多次的即使刷新动作,为了更有效的显示,可以采用对图层进行上锁的行为,这样可以有效的避免刷新的无用重复,即在所有绘制动作都在图层上进行完毕后,才真正的刷到屏幕上。在上锁与解锁之间的所有更新都无效,只有在解锁后,刷新屏幕才有效,故此可以让所有的绘制动作在上锁与解锁之间进行。

MTK的GUI控件算比较全,控件上的使用稍微有点麻烦,但是离不开三点,就是创建,设置和显示。创建,一般的情况下就是申请一个结构,然后把此结构传给具体控件的创建函数。一般情况下,很多时候都会用全局的定义好的结构,而不是动态申请一个新的结构。在MTK的控件函数中,有一些要注意的是,一把create开头的函数,是创建与设置并行的函数,也就是说,传入的结构体此时是一部分填好数据的。

WGUI层中的touch screen的主要流程:当触摸事件到达的时候,Touch Screen模块会调用当前模板的控件集信息,然后逐个询问这些控件是否需要处理该事件,如果控件有回应,则把控制权交给该控件来处理。

WGUI的Draw Manager是一个比较流行的窗口显示机制,以前Java的layout,到现在的Android都有类似的机制。DM(Draw Manager简称)的主要工作方式前面已经提过了,接着来说说控件集中控件类型的描述。第一种是控制类型控件,该类型不是用来显示的,而是用来控制显示的。例如:DM_BASE_LAYER_START 表明是激活基础层,DM_BASE_LAYER_END表明结束基础层处于激活状态。所有在这两个Flag中间的控件都会在基础层上进行绘制。DM_NEW_LAYER_START 和 DM_NEW_LAYER_END是表明创建 一个新层,所有在这两个Flag之间的绘制都在此层上绘制。第二种就是标准的控件类型,如菜单,编辑框,Tab页等。最后一种就是扩展控件类型,如提示框,背景等。如果屏幕上有地方是需要用户自行绘制的话,则可以设置DM_CATEGORY_CONTROLLED_AREA标志,此时遇到此标志时候,系统会让用户自行绘制由这个标志定义的区间。在使用此方法前,必须注册用户自己的函数(此函数就是绘制该区域的函数)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值