热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

引用lyzaily126的MTK的高亮机制1、对于MTK平台中高亮事件的简单分析,仅涉及MMI层的应用牵涉函数:voidSetHiliteHandler(U16itemid,

引用

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 {
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;
}
}
}
}



推荐阅读
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
没有完美的谎言
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有