Recovery选项菜单循环切换选项

在Recovery模式首页,Recovery系统通过调用GetMenuItems()函数向我们展示了一个选项列表,当有按键操作发生时,系统会通过HandleMenuKey()函数来处理按键操作。通常情况下我们可以通过操作VolumeUp和VolumeDown来切换选项。原生环境下,如果当前选项为首项或尾项,我们想要切换至尾项或首项时,不得不频繁操作VolumeUp和VolumeDown进行切换。影响用户体验。那么如果当前选项为首项或尾项时,我们如何通过一次操作进行首尾项的切换呢?

首先我们来看Recovery系统处理按键的函数HandleMenuKey()。

源码地址:https://android.googlesource.com/platform/bootable/recovery/+/android-5.1.1_r2/default_device.cpp

int HandleMenuKey(int key, int visible) {

if (visible) {

switch (key) {

case KEY_DOWN:

case KEY_VOLUMEDOWN:

return kHighlightDown;

case KEY_UP:

case KEY_VOLUMEUP:

return kHighlightUp;

case KEY_ENTER:

case KEY_POWER:

return kInvokeItem;

}

}

return kNoAction;

}

通过上面这段代码了解到,Recovery系统是通过操作VolumeUp来向上切换选项,通过VolumeDown向下切换选项,且通过Power按键进入选项。因此在Recovery.cpp的get_menu_selection()函数中,Recovery系统通过调用上面的HandleMenuKey()函数判断当前动作。然后再根据动作作出相应的处理。这里的处理也就是切换选项,主要是告诉系统用户选择的菜单项和对屏幕中的菜单项进行高亮显示。

源码地址:https://android.googlesource.com/platform/bootable/recovery/+/android-5.1.1_r2/recovery.cpp

static int

get_menu_selection(const char* const * headers, const char* const * items,

int menu_only, int initial_selection, Device* device) {

// throw away keys pressed previously, so user doesn‘t

// accidentally trigger menu items.

ui->FlushKeys();

ui->StartMenu(headers, items, initial_selection);

int selected = initial_selection;

int chosen_item = -1;

while (chosen_item < 0) {

int key = ui->WaitKey();

int visible = ui->IsTextVisible();

if (key == -1) {   // ui_wait_key() timed out

if (ui->WasTextEverVisible()) {

continue;

} else {

LOGI("timed out waiting for key input; rebooting.\n");

ui->EndMenu();

return 0; // XXX fixme

}

}

int action = device->HandleMenuKey(key, visible);

if (action < 0) {

switch (action) {

case Device::kHighlightUp:

--selected;

selected = ui->SelectMenu(selected);

break;

case Device::kHighlightDown:

++selected;

selected = ui->SelectMenu(selected);

break;

case Device::kInvokeItem:

chosen_item = selected;

break;

case Device::kNoAction:

break;

}

} else if (!menu_only) {

chosen_item = action;

}

}

ui->EndMenu();

return chosen_item;

}

上面标注为红色的代码也就是Recovery系统相应按键作出的选项切换的动作。也就是说如果当前用户按下一次VolumeUp健,Recovery系统就会向上切换选项菜单。但是如果当前选项菜单处于首项或尾项时,Recovery系统就会调用screen_ui.cpp中的SelectMenu()函数进行进一步的处理。

源码地址:https://android.googlesource.com/platform/bootable/recovery/+/android-5.1.1_r2/screen_ui.cpp

int ScreenRecoveryUI::SelectMenu(int sel) {

int old_sel;

pthread_mutex_lock(&updateMutex);

if (show_menu > 0) {

old_sel = menu_sel;

menu_sel = sel;

if (menu_sel < 0) menu_sel = 0;//这里表示如果当前项为首项,按键操作为向上切换时,保持首项不变。

if (menu_sel >= menu_items) menu_sel = menu_items-1;//这里表示如果当前项为尾项,按键操作为向下切换时,保持尾项不变。

sel = menu_sel;

if (menu_sel != old_sel) update_screen_locked();//重绘screen刷新界面

}

pthread_mutex_unlock(&updateMutex);

return sel;

}

上面红色部分即原生对当前项为首项或尾项时,切换选项所作出的处理。对于处理的方法在上面的备注中已经有相应的注释。那么我们想要实现循环切换选项的突破口也就是这个函数了。下面是修改后的函数:

int ScreenRecoveryUI::SelectMenu(int sel) {

int old_sel;

pthread_mutex_lock(&updateMutex);

if (show_menu > 0) {

old_sel = menu_sel;

menu_sel = sel;

if (menu_sel < 0) {

menu_sel = menu_items-1;//这里表示如果当前项为首项,按键操作为向上切换时,切换至尾项

else if (menu_sel >= menu_items){

menu_sel = 0;//这里表示如果当前项为尾项,按键操作为向下切换时,切换至首项

}

sel = menu_sel;

if (menu_sel != old_sel) update_screen_locked();//重绘screen刷新界面

}

pthread_mutex_unlock(&updateMutex);

return sel;

}

时间: 2024-07-28 13:46:23

Recovery选项菜单循环切换选项的相关文章

安卓开发_浅谈OptionsMenus(选项菜单)

Android平台下所提供的菜单大体上可分为三类:选项菜单.上下文菜单和子菜单. 当Activity在前台运行时,如果用户按下手机上的Menu键,此时就会在屏幕低端弹出相应的选项菜单.但这个功能需要开发人员编程来实现的,如果在开发应用程序时没有实现该功能,那么程序运行时按下手机的meun键是不会起作用的. 这里就先学习 选项菜单OptionsMenus 创建选项菜单有两种方式 一.xml文件静态创建 7 package information; 8 9 import com.example.al

[android](学习笔记7)为应用程序添加选项菜单

1 在xml文件中定义选项菜单: 创建res/menu目录,并添加xml文件:选择New-Android XML File.选择Menu文件资源类型: 打开新建的xml文件,切换到xml编辑视图,添加新的item元素: <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" &g

浅谈Win7如何删除桌面右键菜单amd vision选项?

许多Win7的客户在桌面运行右键菜单后,发现里面多了一项amd vision engine controlcenter,,很显然这是AMD显卡的控制台入口,原来他们都是在安装了显卡驱动程序后,才出现这个选项的,我们常常会用到右键菜单,里面的东西会许多,显得很乱,不想再增加了,那怎么样才能删除这个选项呢?接下来,win7系统下载,杀毒小编就告诉大家删除的方案. 删除方案: 第一.点击开始-执行,输入CMD 回车运行命令提示符;Win7如何删除桌面右键菜单amdvision选项? 第二.在命令提示符

Win7文件右键菜单打开方式选项不见了怎么办,如何恢复?

Win7文件右键菜单打开方式选项不见了怎么办,如何恢复?今天突然发现,对着Win7电脑里面的文件,单击鼠标右键时,右键菜单中的打开方式选项不见了,如下图所示.这种情况大多是,由系统动态链接库文件被破坏或出现异常情况造成的,那么我们又如何解决这个问题呢?小编参考过高手朋友的建议后,成功恢复了打开方式选项,希望下面的操作方法,对于到类似情况的朋友能有所帮助! 第一步.使用regedi运行命令,打开"注册表编辑器" 第二步.在注册表编辑器界面,依次展开"HKEY_CLASSES_R

《Andrioid_Popupwindow案例》popWindow做Menu,popWindow做选项菜单

先看效果,上图展示了最近在开发的项目经常用到的pop案例,包括一般的选项,下拉选项,menu等,布局就不贴了,很简单 相信都能秒懂,贴下pop的核心代码 /** * * @author yaguang.wang * */ public class MenuPop extends PopupWindow { private int resId; private Context mContext; private View popView; private LayoutInflater inflat

单击下拉菜单里面的选项实现跳转

看到别人的网站,都有单击一个下拉菜单,然后就出来一些选项,接着单击选项,就跳转到相应的界面,实在让人羡慕,最后自己也想试一试. 一开始打算采用的技术是:option里的显示的字体是一个超链接.但是最后发现单击链接以后没反应.所以只好再新建一个文件,通过获取的内容跳转到相应的界面. 搜了半天,都好麻烦,而且实现起来都不行.自己也做了很多实验,都行不通.后来也是搜索了好多关键词都不行. 最后在搜狗里面搜索" select 跳转",结果搜出来需要的代码. 看来下次搜索的关键词就得是自己直接想

Android 选项菜单Options Menu

一般的手机上都会有一个home键,单击后会显示出一系列的菜单,这个即是选项菜单(Options Menu),Options Menu开发主要涉及Menu,MenuItem,Submenu. 1.一个Menu对象代表一个菜单,Menu对象可以添加MenuItem,也可以添加子菜单Submenu: 2.MenuItem 对象代表一个菜单选项,通常MenuItem实例通过Menu.add()方法添加. menu.add(int group_id,int item_id,int order,CharSe

OptionMenu选项菜单

1 #选项菜单 2 from tkinter import * 3 root = Tk() 4 variable=StringVar() 5 variable.set('one') 6 w = OptionMenu(root,variable,'one','two','three') 7 w.pack() 8 9 mainloop()

Android创建并响应选项菜单

创建options menu 之前提到,Android的activity已经为我们提前创建好了android.view.Menu对象,并提供了回调方法onCreateOptionsMenu(Menu menu)供我们初始化菜单的内容.该方法只会在选项菜单第一次显示的时候被执行,如果你需要动态改变选项菜单的内容,请使用 onPrepareOptionsMenu(Menu). @Overridepublicboolean onCreateOptionsMenu(Menu menu) { // 调用父