当前位置: 首页 > news >正文

MTK一些有用的层函数

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

相关文章:

  • 基于SWOOLE的分布式SOCKET消息服务器架构
  • MTK的铃声修改与替换
  • 基于SWOOLE的高可用分布式SOKET服务器系统搭建V2.0
  • 美化MTK的拨号窗口
  • javascript 18位身份证校验程序
  • MTK的DM应用实例
  • 优酷KUX格式转码
  • 推荐一款全面的系统性能监控工具 -- glances
  • 再转载一篇---引用 MTK的高亮机制
  • 解决加密的HLS(m3u8)视频转换问题
  • 再谈MTK的History机制
  • 在屏幕外的窗口,鼠标移动到屏幕边缘时自动把屏幕外部分拉回屏幕内怎么设置?
  • MTK的图片资源的修改与替换
  • [转]节省 3/4 的设计时间:14个设计神器
  • 转载一篇 EMI整改经验
  • [case10]使用RSQL实现端到端的动态查询
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【剑指offer】让抽象问题具体化
  • 3.7、@ResponseBody 和 @RestController
  • Android单元测试 - 几个重要问题
  • docker容器内的网络抓包
  • Git初体验
  • HashMap ConcurrentHashMap
  • java多线程
  • JSONP原理
  • js数组之filter
  • js作用域和this的理解
  • Linux gpio口使用方法
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • React Native移动开发实战-3-实现页面间的数据传递
  • Spark RDD学习: aggregate函数
  • Spring Boot MyBatis配置多种数据库
  • Swoft 源码剖析 - 代码自动更新机制
  • zookeeper系列(七)实战分布式命名服务
  • 闭包,sync使用细节
  • 大数据与云计算学习:数据分析(二)
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 来,膜拜下android roadmap,强大的执行力
  • 强力优化Rancher k8s中国区的使用体验
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 仓管云——企业云erp功能有哪些?
  • 说说我为什么看好Spring Cloud Alibaba
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​业务双活的数据切换思路设计(下)
  • # Panda3d 碰撞检测系统介绍
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1) caustics\
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)ssm高校实验室 毕业设计 800008
  • (四)【Jmeter】 JMeter的界面布局与组件概述