常见问题回复
1. Inone应用层开发语言和开发系统环境?
回复:Inone应用层开发基于C/C++语言开发,其OS系统基于深度优化linux,GUI基于InoneGUI,所以在linux开发的第三方包可以快速移植Inone应用中。
2. 如何整合自己的C/C++文件和头文件到Inone应用层?
回复:添加C/C++代码文件直接到userctrl目录即可,头文件添加到include目录下,Makefile文件已经做到自动扫描上面两个目录的头文件和代码文件,所以理论上无需调整;但如需要link第三方的库文件,需要修改Makefile里的LINKFLAGS变量,在其后加上自己的链接库即可。
3. 如何固化应用程序到系统FW?
回复:此部分需要联系Inone公司对应窗口工程师来处理。
4. 如何使用定时器?
回复:启动定时器START_TIMER(X),停止定时器STOP_TIMER(X),定时器间隔X最小单位为10ms,所以如需要不同的定时器,X请按10的倍数关系来处理。
注意:在使用定时器时,请不要直接在XXXCtrl::OnPageTimer里调用InoLaunchActivity启动页面,会造成死锁问题,可以采用InoPostMessage的异步方式在OnPostKeyEvent启动页面。
示例如:
LRESULT XXXXActivity::OnPostKeyEvent(Page *pPage, UINT iMsg, WPARAM wParam, LPARAM lParam, DWORD dwTime)
{
CLog::LogU("[%s:%s] iMsg:%d wParam:%d \n", __FILE__, __FUNCTION__, iMsg, wParam);
if (iMsg == MSG_NOTIFY_SLEEP)
{
InoLaunchActivity(APP_NAME, ID_SLEEP_LAYOUT);
}
return ERR_OK;
}
VOID XXXXActivity::OnPostUserTimer(LPVOID pUser, UINT32 iInterval)
{
// CLog::LogU("[%s:%s] iInterval:%d\n", __FILE__, __FUNCTION__, iInterval);
if (XXXX_SLEEP_TIMER == iInterval)
{
InoPostMessage(APP_NAME, MSG_NOTIFY_SLEEP);
}
}
5. 如何强制更新控件UI?
回复:可以使用控件对象pctrl->AddRefreshCtrl()来强制刷新它。
6. 如何控制按键控件状态不要自动切换,如从非选中状态切到选中状态?
回复:可以在按键的OnClick函数里,调用pControl->SetSelected(FALSE)强制复归状态。
7. 如何实现回主界面和返回功能?
回复:回主界面:mpActivity->GoHome(); 返回:mpActivity->GoBack();
8. 如何传输按键事件给激活页面?
回复:InoPostMessage(MSG_KEY_DOWN, value);
9. 如何启动APP或页面?
回复:InoLaunchActivity(APP_NAME, ID_XXX_LAYOUT);
9.1 易错点:A应用调用B应用的某个页面ID_XXX_LAYOUT时发生异常
原因:由于ID_XXX_LAYOUT会伴随应用中资源数量动态生成,所以会存在ID_XXX_LAYOUT值变化问题,而调用者页面ID_XXX_LAYOUT没有同步,从而发生异常
对策: 调用者(A应用)使用用户自定义的页面ID,如USER_ID_XXX_LAYOUT
代码:
==========
xxx.h "xxx"为项目名(A/B应用公共头文件)
==========
#define USER_ID_LAYOUT 0x1000
#define USER_ID_LIST_LAYOUT (USER_ID_LAYOUT + 1)
#define USER_ID_PICTURE_LAYOUT (USER_ID_LAYOUT + 2)
==========
xxxactivity.cpp (B应用)
==========
STRING xxxActivity::GetLayoutByID(INT iLayoutID)
{
// CLog::LogU("[%s:%s] iLayoutID:%d\n",__FILE__,__FUNCTION__,iLayoutID);
switch(iLayoutID)
{
case USER_ID_LIST_LAYOUT:
case ID_LIST_LAYOUT:
{
return NAME_LIST_LAYOUT;
}
case USER_ID_PICTURE_LAYOUT:
case ID_PICTURE_LAYOUT:
{
return NAME_PICTURE_LAYOUT;
}
default: return "";
}
}
==========
main.cpp (调用者A应用)
==========
VOID MainCtrl::ProgItem_ListItemClick(InoListItem *pControl, INT iIndex, BOOL bLongClick)
{
//InoLaunchActivity(APP_NAME, ID_PROGRESS_LAYOUT);
InoLaunchActivity(APP_NAME, USER_ID_PICTURE_LAYOUT);
}
10. 如何传递启动参数给其它APP或页面?
回复:
Get InoLaunchActivity pParam pointer
eg: get pParam value
INT pParam = 20; InoLaunchActivity(APP_NAME,ID_MAIN_LAYOUT,(LPVOID)pParam); INT param = LAUNCHACTIVITY_PARAM(); #define LAUNCHACTIVITY_PARAM() (mpPage->GetPageParam());
11. 如何同其它APP通信
回复:可以采用如下方式进行
11.1 APP与APP间使用so库形式分离,所以可以采用传统API调用方式通信;
11.2 采用APP间消息传递方式:
同步消息:
LRESULT InoSendMessage(STRING strAppName, UINT iMsg, WPARAM wParam = NULL, LPARAM lParam = NULL);
异步消息:
INT InoPostMessage(STRING strAppName, UINT iMsg, WPARAM wParam = NULL, LPARAM lParam = NULL);
消息定义:
使用宏定义INO_USERMSG(X)
#define MSG_GETID INO_USERMSG(1)
使用例程:
调用方:
#define INOUPDATE_NAME "inoupdate"
#define MSG_GETID INO_USERMSG(1)
LRESULT ivalue;
ivalue = InoSendMessage(INOUPDATE_NAME, MSG_GETID);
被调用方:
注意:
1. 消息处理必须放在全局Activity的按键处理函数里来处理,不要放到页面的按键处理函数,否则会出现不可预见结果;
2. 当前使用变量地址时候,不能使用局部变量。
INT ivalue = 200;
LRESULT XXXXXXActivity::OnPostKeyEvent(UINT iMsg, WPARAM wParam, LPARAM lParam, DWORD dwTime)
{
if (iMsg == MSG_GETID){
return (LRESULT)&ivalue;
}
return ERR_OK;
}
12. Aiinone支持的图片和颜色格式
回复:图片PNG/.9.PNG/JPG/GIF格式
图片格式 | 优缺点 | 使用建议 | 备注 |
---|---|---|---|
PNG | 无损压缩,图片质量好,占用空间较大,速度快 | 小尺寸图标使用 | 32bits |
.9.PNG | 无损压缩,图片质量好,支持无损拉伸,速度快,类似Android .9图片 | 背景图使用 | 32bits |
JPG | 有损压缩,图片质量较好,占用空间小,速度慢 | 大尺寸背景图使用 | |
GIF | 用作动画简单方便 | 动画使用 |
13. 当同时使用列表和画布控件时,调用UserNotifyDataChanged(mpList1)编译异常?
回复:请在对应的UserNotifyDataChanged加上对应类限定符号
IScrollListListener::UserNotifyDataChanged(mpList1);
ICanvasListener::UserNotifyDataChanged(mpCanvas1);
14. 按钮控件的长按功能未生效
回复:请确认“未生效按键控件”的"长按触发时间"(下图红框部分)值是否>=20?,如没有,请设定此值>=20,此值是以50ms为单位,即最小长按时间要>=1s长按功能才能生效。
15. 如何优化UI层刷新效率
回复:
1.可以通过设置层的透明属性来实现,如自己应用有背景图或背景色,无需在应用界面显示壁纸图,此场景下可以将应用层设置为不透明,这样在应用刷新时就无需再重复绘制壁纸,从而达到提升效率效果。
mpActivity->SetLayerStatus(LAYER_FLAG_ATTRIB_TRANSP, FALSE); //关闭应用层透明效果,再次开启设置参数为"TRUE"即可
2.设置对象的透明属性,如列表使用场景下,需要达成更优的滑动体验,可以将列表对象属性设置为不透明,这样可以减少绘制层数量。
mpXXX1->SetCtrlAttribByBit(CTRL_ATTRIB_OPA); //设置对象不透明,开启透明清除ClrCtrlAttribByBit(CTRL_ATTRIB_OPA)
16. UI刷新关闭/开启控制
回复:
DM->SetDisplayRefresh(FALSE); //FALSE:关闭这个UI刷新 TRUE:开启这个UI刷新
用于在某些场合,做到整体UI刷新,先关闭刷新,准备好刷新数据,再开启刷新。如做切换壁纸时,发生壁纸切换按钮透色问题。