文章目錄
android虛擬按鍵
android標準鍵盤是有 HOME,MENU,BACK,SEARCH等,但是同時要保持工業設計。nexus one沒有用普通按鍵用觸控螢幕實現,
顯示屏是800X480,但是在電容觸控螢幕是8xx*480的就是比800要大的地方就變成了虛擬按鍵,類比了android標準按鍵。
1 方案
要實現虛擬按鍵,在android裡面是靠兩層協助實現,底層要把虛擬按鍵在比顯示屏多出的地方規定好虛擬按鍵的位置大小以及索引值等,給上層
一檔案介面。上層java層啟動一個服務來讀取這一地區的按鍵響應,這樣就是大體的架構。具體實現如下:
1.1 底層虛擬按鍵功能實現方案
簡而言之,就是在核心中把虛擬按鍵的所有資訊通過sys檔案系統的方式給上層,sys檔案系統的路徑是約定好的所以代碼如下實現。給出資訊的
協議格式是一段連續的字串,每個按鍵有六項分別用冒號分割,按鍵按鍵之間也是用冒號分割,六項按順序分別是:
鍵類型:索引值:按鍵地區中心x座標:按鍵地區中心y座標:按鍵地區寬:按鍵地區高
arch/arm/mach-msm/board-mahimahi.c
static ssize_t mahimahi_virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf){if (system_rev > 2) {/* center: x: back: 55, menu: 172, home: 298, search 412, y: 835 */return sprintf(buf,__stringify(EV_KEY) ":" __stringify(KEY_BACK) ":55:835:90:55" ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":172:835:125:55" ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":298:835:115:55" ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":412:835:95:55" "/n");} else {/* center: x: home: 55, menu: 185, back: 305, search 425, y: 835 */return sprintf(buf,__stringify(EV_KEY) ":" __stringify(KEY_HOME) ":55:835:70:55" ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":185:835:100:55" ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":305:835:70:55" ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":425:835:70:55" "/n");}} static struct kobj_attribute mahimahi_virtual_keys_attr = {.attr = {.name = "virtualkeys.synaptics-rmi-touchscreen",.mode = S_IRUGO,},.show = &mahimahi_virtual_keys_show,}; static struct attribute *mahimahi_properties_attrs[] = {&mahimahi_virtual_keys_attr.attr,NULL}; static struct attribute_group mahimahi_properties_attr_group = {.attrs = mahimahi_properties_attrs,}; struct kobject *properties_kobj; properties_kobj = kobject_create_and_add("board_properties", NULL);if (properties_kobj)ret = sysfs_create_group(properties_kobj, &mahimahi_properties_attr_group);if (!properties_kobj || ret)pr_err("failed to create board_properties/n");
在Android系統中,觸控螢幕裝置發送的是RawInputEvent(原始輸入事件),而按鍵發送的是KeyEvent(按鍵事件)。KeyEvent直接發送給應用程式層,RawInputEvent在Android的Java架構中被轉換成MotionEvent發送給應用程式層。
在Android系統中虛擬按鍵的實現方法是:在某種情況下,將RawInputEvent轉換成KeyEvent。
frameworks/base/services/Java/com/android/server目錄中的InputDevice.Java檔案負責處理虛擬按鍵的主要檔案。
虛擬按鍵的處理相對簡單,需要根據以下檔案對虛擬按鍵的內容進行配置:
- /sys/board_properties/virtualkeys.{devicename}
在InputDevice.Java檔案中通過readVirtualKeys,對進行訊息的轉化。根據設定檔將RawInputEvent轉換成按鍵相關的內容。
virtualkeys.{devicename}是虛擬按鍵的適配檔案,需要在目標檔案系統的/sys/board_ properties/目錄中。
虛擬按鍵設定檔的格式如下所示:
- 0x1:掃描碼:X:Y:W:H:0x1: ……
例如,在MSM的mahimahi平台上查看虛擬按鍵的設定檔如下所示:
- # cat /sys/board_properties/virtualkeys.synaptics-rmi-touchscreen
- 0x01:158:55:835:90:55:0x01:139:172:835:125:55:
0x01:102:298:835:115:55:0x01:217:412:835:95:55
由此可見,其中定義了4個地區的虛擬按鍵,它們的Y座標相同,可見4個按鍵的矩形地區位於水平的一排。其轉換的掃描碼分別為158,139,102,217,分別對應於BACK(返回),MENU(菜單),HOME(主介面),SEARCH(搜尋)這4個按鍵。
另外一個系統的虛擬按鍵的設定檔如下所示:
- $ cat /sys/board_properties/virtualkeys.qtouch-touchscreen
- 0x01:139:90:936:116:104:0x01:102:252:936:
116:104:0x01:158:402:936:116:104
其轉換的掃描碼分別為:139,102,158,分別對應於MENU(菜單),HOME(主介面),BACK(返回)這3個按鍵。