am架构学习笔记(二) 屏幕切换

来源:互联网 发布:易名网络 编辑:程序博客网 时间:2024/05/09 05:38

   

一、 am屏 切换到  am屏

          am屏切换到am屏,一般由按键事件引发,在am消息处理中,触发MSG_HW_KEYPAD事件,处理该消息时调用Am_EventHandlerFunc函数,再由全局变量g_nEvent的值来决定是否创建am屏。

          具体步骤:

 1,push/pushEx函数:通过push/pushEx函数,将即将写入的屏幕参数写入屏幕栈的顶层,将旧屏压入第二层。同时在push/pushEx函数中将g_nEvent的值置为LAYERCHANGE。

 2,继续Update旧屏的剩下的model。

3,Update完后,若g_nEvent为LAYERCHANGE,则开始创新的am屏。注意:此时的pCurrentBaseLayout仍指向旧屏,因为此时旧屏还没有free掉。

4,创屏准备工作:1,free掉旧屏,pCurrentBaseLayout = NULL;

                                  2,free掉旧屏的hash表,新建本屏幕的hash表。

                                  3,从layoutStack中取出param,该参数存储旧屏传过来的参数。并将这些参数写入新屏的hash表。

5,pCurrentBaseLayout赋值,由于新屏的入口函数已经写入在push/pushEx函数里写入到pScreenList->f_CreateScreen字段里,因此通过:

                 CreateFun = layoutStack.f_GetCreateFun();

                *pCurrentBaseLayout = CreateFun((atom_t_graphics *)(&g_graphicsContext), *param);

即可将所有参数写入pCurrentBaseLayout中,注意,此时只是对新屏的所有model的参数进行了复制,还没有创建。

Note:  pCurrentBaseLayout是一个指向am_t_model的指针,因此他可以接受所有model的返回值,因为所有的model类型都继承于am_t_model类型。

6,(*pCurrentBaseLayout)->update((*pCurrentBaseLayout), (t_rect*)&LCD_Screen, *param);

Upadate新屏的所有model,注意此时只是将所有model写到显存,还没有画出来。

7,响应AM_MSG_MMI_PAINT消息,Am_MMI_Render(pCurrentBaseLayout, param);会渲染新屏的所有model。

原创粉丝点击