1、框架分析
1.1、数码相框的整体框架
我们最终要实现的功能如上图,分别有几个页面,其中主菜单为mainpage
,通过选择mainpage
中不同的功能执行跳转至不同的页面:
Mianpage
页面—(选择浏览模式–>explore
页面----(选择页面中的文件(这里是文件,而不是文件夹))—>browse
页面Mianpage
页面—(选择连播模式–>auto
页面----(连播显示过程中点击)—>browse
页面Mianpage
页面—(选择设置–>setting
页面----(点击setting
中的选择目录)—>explore
页面setting
页面----(点击setting
中的设置间隔)—>interval
页面
1.2、页面管理模块框架
1.3、抽象出结构体
以main_page.c为例分析结构体:
上面我们提取出来了我们目前想到的每个页面应该涉及的共性结构体,肯定每个页面要显示当前页面的内容,所以有个run
函数。每个页面肯定要根据接下来的动作做出相应的反映,所以有个getinputevent
函数,我们要准备好每个页面用户可能要跳转的页面,这样在用户执行相应的操作的时候,我们就可以直接提取出来,这样就不会很卡。而且用户在点击的之前会停顿一下,我们就可以利用这段时间。
这个结构体的成员的大体框架如何?
我们以main_page.c
为例:main_page.c
里面的 run
函数: 显示画面,获取事件,根据时间类型再执行下一步的run
函数。
文字,图片:
由于我们显示页面的时候肯定是既有文字也有图片,所以肯定要有个渲染层,对于文字我们用freetype
,对应图片我们用libjpeg
。
之后对于事件而言,我们触发事件可能是通过触摸笔,或者按键(这个一般不会用),所以还有个输入事件模块。
2、框架编写
代码见:第 1 个项目数码相框全部源码_图片_文档\源码(含讲课过程中即时编写的文档)\12.数码相框项目\14.digital_photo_frame_8.2 节_框架\14.digial_photo_frame
。
我们要显示每个页面的框架,建立一个page
文件夹,里面包含每个页面。
我们暂时以mainpage.c
来举例,他的程序框架是:
上面我们的MainPageGetInputEvent
用input_manager.c
里面的GetInputEvent
函数,这个GetInputEvent
会让当前线程休眠,如果有触摸屏事件后就会唤醒,然后我们再处理数据,处理数据主要是用来判断触摸屏触摸了哪个位置,从而知道他按下了哪个地方。
由于我们要考虑返回上个页面的情况,所以在对事件处理的时候要先保存当前的页面执行完动作后恢复,这个怎么理解呢?比如说我们在main_page
页面,用户点击了浏览模式。
我们代码就会进入main_page.c
里面的run
函数,进入浏览模式的case
分支,然后保存页面,之后我们就要进入explore
页面。
就要调用explore
的run
函数,进去之后如果客户想返回到上一级的main_pager
的页面,当他点击了向上的位置,我们还要返回到main_page
页面,所以还有个恢复的动作(我猜测在explore
里面点击向上的区域,代码只要直接return
就可以了,因为他和mainpage
都是一个线程)点击上一个一面的时候先判断是不是explore
的最顶层了,如果是就直接return
,就会到我们main_page
的恢复页面的动作
了。
我们在page
文件夹内写了很多框架了,基本都和main_page.c
一样,我们每个page
里面都有个run
函数,用来显示文字和图片。
所以我们要建立一个render
一个渲染文件夹,他会用到font
文件夹里面的freetype
,还要调用一个libjepg
文件夹,里面建立一个libjpeg.c
,这个c文件会用来调用libjpeg
库用来实现某些函数给render
调用,用来来显示图片。也就是说render
里面的render.c
文件会调用font
里面的freetype.c
里面的结构体,和libjpeg
里面的libjpeg.c
。
render.c
里面调用: