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

再转载一篇---引用 MTK的高亮机制

引用

lyzaily@126MTK的高亮机制

1、 对于MTK平台中高亮事件的简单分析,仅涉及MMI层的应用

牵涉函数:

void SetHiliteHandler( U16 itemid, FuncPtr hiliteFuncPtr );

void RegisterHighlightHandler( void (*f)(S32 item_index) );

void ExecuteCurrHiliteHandler( S32 hiliteid );

原理: 1. RegisterHighlightHandler(ExecuteCurrHiliteHandler)

A. ExecuteCurrHiliteHandler函数

通过当前高亮菜单的ID : hiliteItemID

执行与此ID关联的执行函数: maxHiliteInfo[hiliteItemID].entryFuncPtr

B. RegisterHighlightHandler函数

将上述函数指针(句柄)传给全局变量 MMI_list_highlight_handler 以便调用

通过RegisterHighligtHnder函数我们就可以知道,对于不同类型的菜单会有不同的全局变量,通过才这样的全局变量,系统其他部分的代码就可以直接使用该全局变量进行对高亮函数的调用。要注意的是对于每一个屏幕来说index都是从零开始的。

/*****************************************************************************
* FUNCTION
* RegisterHighlightHandler
* DESCRIPTION
* Registers the highlight handler to be called in menu screens
* PARAMETERS
* f [IN] Is a pointer to a highlight handler function
* This(?) [IN] Is a zero based index of the highlighted menuitem.
* RETURNS
* void
*****************************************************************************/
void RegisterHighlightHandler(void (*f) (S32 item_index))
{
MMI_list_highlight_handler = f;
MMI_matrix_highlight_handler = f;
MMI_circular_3D_highlight_handler = f;
}
/*****************************************************************************
* FUNCTION
* ExecuteCurrHiliteHandler
* DESCRIPTION
* This function finds out the current highlight menu item's handler and
* executes it with clear KEY_RIGHT_ARROW key handler. Sometimes the sub menu
* items may be hidden and the sub menu item index will be different. This
* function also handle this case.
* PARAMETERS
* hiliteid [IN] ID of the item for which highlight handler needs to
* be executed.
* RETURNS
* void
*****************************************************************************/
void ExecuteCurrHiliteHandler(S32 hiliteid)
{
/* To avoid the arrow left key to entry unexpected function, while other APP need they shall register

again as BY request. */
ClearKeyHandler(KEY_RIGHT_ARROW, KEY_EVENT_DOWN);

ExecuteCurrHiliteHandler_Ext(hiliteid);

}
通过该函数的注释就可以知道:当在一个菜单窗口中移动光标时,光标每动到一个菜单项时,系统(可能是Framwork模块)就会调用该函数找到对于菜单项的高亮处理函数并执行;因为ExecuteCurrHiliteHandler是去找该高亮函数,说明该函数已经在系统注册好了,那么该菜单项的高亮处理函数是在什么被注册的呢?就是在每个模块的初始化函数中,例如闹钟模块的 AlmInit()初始化函数。

另外注意的一点时,ExecuteCurrHiliteHandler只用于静态菜单,所谓静态菜单,就是在枚举GLOBALMENUITEMSID中有明确ID定义的菜单项。

还有一点是,该函数在查找子菜单项时会自动忽略掉那些隐藏的菜单项;如果你在你的业务逻辑中使用了如下的语句:

RegisterHighlightHandler(ExecuteCurrHiliteHandler);
则,如果你要获得KEY_RIGHT_ARROW键的功能 就必须重新向framework模块注册。否则KEY_RIGHT_ARROW键是没有任何相应的,因为每当高亮一个菜单项时ExecuteCurrHiliteHandler就被执行一次,同时KEY_RIGHT_ARROW键的功能也就没clear一次。那么在那里重新加入KEY_RIGHT_ARROW键的功能能,就在每个菜单项的高亮相应函数中,注意该菜单中每个菜单项高亮相应函数中都必须加入重新设置KEY_RIGHT_ARROW键的功能函数。

2. 关联高亮ID与执行函数

void SetHiliteHandler(U16 itemid, FuncPtr hiliteFuncPtr)

该函数将ID与函数关联:

maxHiliteInfo[itemid].entryFuncPtr = hiliteFuncPtr ;

itemid是传入的菜单ID, hiliteFuncPtr是传入的高亮执行函数

Note: Please distinguish the function SetHiliteHandler from

RegisterHighlightHandler() which is provided by UI layer.

SetHiliteHandler() is for single menu item;

RegisterHighlightHandler() is global for all menu items.

2、SetHintHandler()

DESCRIPTION

This function is used for register the handler for the menu item. If the

menu items are pre-definable, the applications use this function to set

the highlight handlers.(注意处的注释,说明了要用此函数向framework注册高亮函数,则该菜单项ID必须

已经提前被定义好了,也就是说必须是静态菜单项)。

Note: Please distinguish the function from RegisterHighlightHandler()

which is provided by UI layer. SetHiliteHandler() is for single

menu item; RegisterHighlightHandler() is global for all menu items.

[注意]

请注意 void SetHiliteHandler(U16 itemid, FuncPtr hiliteFuncPtr) 与

void ExecuteCurrHiliteHandler(S32 hiliteid)函数的参数区别,前者是itemid而后者是hiliteid,后者使用高亮菜单索引hiliteid和currParentID取得真正的itemid。参加如下代码:

void ExecuteCurrHiliteHandler_Ext(S32 hiliteid)
{
FuncPtr currFuncPtr = NULL;
S32 hiliteItemID;

currHiliteID = (U16) hiliteid;
if (currParentID == 0)
{
return;
}

/* check if menuitem is hidden */
hiliteItemID = GetSeqItemId_Ext((U16) currParentID, (S16) hiliteid); //返回真正的菜单项ID
currFuncPtr = maxHiliteInfo[hiliteItemID].entryFuncPtr

if (currFuncPtr)
{
(*currFuncPtr) ();
}
}

会先执行SetHintHandler注册的函数,然后执行

RegisterHighlightHandler注册的函数。注意SetHintHandler注册的函数是在ConstructHintsList()中被调用执行的,并不是在菜单高亮时被执行的,菜单高亮时只执行了RegisterHighlightHandler注册的函数。ConstructHintList将APP传入的指针数组于全局数组hintData[idx]相关联;而SetHitHandler注册的函数完成对全局数组hintData[idx]的赋值。

3 、ConstructHintsList()

Constructs Hint List for a static menu screen

void ConstructHintsList(U16 parentID, U8 **hintArray)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
U8 i, noOfChild;
U16 hiliteItemID[MAX_SUB_MENUS];
U8 idx = 0;

/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
noOfChild = (U8) GetNumOfChild(parentID);
for (i = 0; i < noOfChild; i++)
{
hiliteItemID[i] = GetSeqItemId((U16) parentID, (S16) i);
/* check if menuitem is hidden */
if (!mmi_frm_test_menu_item_hide(hiliteItemID[i])) /* the menuitem is not hidden */
{
if (maxHiliteInfo[hiliteItemID[i]].hintFuncPtr)
{
(*maxHiliteInfo[hiliteItemID[i]].hintFuncPtr) (idx);//SetHintHandler注册的函数的函数在此被执行
hintArray[idx] = hintData[idx];//该语句是该函数的核心,就是将全局变量hintData[idx]数组地址

//赋给用户传过来的指针数组;至于hintData[idx]中是否有数据不

//管;hintData[idx]的数据会在调用SetHintHandler注册的函数时对其

//进行初始化;要记住SetHintHandler注册的函数在SetHiliteHandler注册的

//函数之前执行。
idx++;
}
else
{
hintArray[idx++] = NULL;
}
}
}
}

相关文章:

  • 解决加密的HLS(m3u8)视频转换问题
  • 再谈MTK的History机制
  • 在屏幕外的窗口,鼠标移动到屏幕边缘时自动把屏幕外部分拉回屏幕内怎么设置?
  • MTK的图片资源的修改与替换
  • [转]节省 3/4 的设计时间:14个设计神器
  • 转载一篇 EMI整改经验
  • Linux TIME_WAIT 太多 优化 解决
  • Sql Server 性能分析1 –查看数据库的相关信息
  • 某游戏公司的MYSQL配置文件
  • CentOS7 之系统优化方案
  • 存储过程中的行集作为子查询
  • CentOS6 下安装RabbitMQ和ErLang
  • MTK工作中可以使用的批处理脚本
  • PHP排列组合算法
  • 通信运营商如何理性应对带号转网(1)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • CentOS7简单部署NFS
  • Create React App 使用
  • express + mock 让前后台并行开发
  • github从入门到放弃(1)
  • JavaWeb(学习笔记二)
  • VuePress 静态网站生成
  • 复杂数据处理
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​520就是要宠粉,你的心头书我买单
  • ​业务双活的数据切换思路设计(下)
  • #《AI中文版》V3 第 1 章 概述
  • #includecmath
  • #Spring-boot高级
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (floyd+补集) poj 3275
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (阿里云万网)-域名注册购买实名流程
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (算法)区间调度问题
  • (转)fock函数详解
  • (转)大型网站架构演变和知识体系
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .java 9 找不到符号_java找不到符号
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET开源快速、强大、免费的电子表格组件
  • .php文件都打不开,打不开php文件怎么办
  • ::什么意思