android TP虚拟按键

在TP的driver中,报虚拟按键的方法常见的有两种:

1.直接报键值(kernel的)

2.报一个坐标,上层通过KL的解析来判定是哪个键。


下面说下第二种:


TP的kl被存放在/sys/board_properties/virtualkeys.devicename中,pull出来后可以看看内容:

0x01:139:100:900:40:60:0x01:158:400:900:40:60

可以发现就是在驱动代码中写的范围,分别是中心点X,中心点Y,宽度和高度,其实就是一个矩形区域,以X,Y为中心点,分别延伸 w/2, h/2。

4.0上对此kl的解析是在virtualkeymap.cpp中:

[cpp]  view plain copy
  1. do {  
  2.            String8 token = mTokenizer->nextToken(WHITESPACE_OR_FIELD_DELIMITER);  
  3.            if (token != "0x01") {  
  4.                LOGE("%s: Unknown virtual key type, expected 0x01.",  
  5.                      mTokenizer->getLocation().string());  
  6.                return BAD_VALUE;  
  7.            }  
  8.   
  9.            VirtualKeyDefinition defn;  
  10.            bool success = parseNextIntField(&defn.scanCode)  
  11.                    && parseNextIntField(&defn.centerX)  
  12.                    && parseNextIntField(&defn.centerY)  
  13.                    && parseNextIntField(&defn.width)  
  14.                    && parseNextIntField(&defn.height);  
  15.            if (!success) {  
  16.                LOGE("%s: Expected 5 colon-delimited integers in virtual key definition.",  
  17.                      mTokenizer->getLocation().string());  
  18.                return BAD_VALUE;  
  19.            }  

0X01是标志位,接下来的一位是scancode,再接下来就是xywh。

需要注意的是实际的范围是[x-w/2,x+w/2]  ,[y-h/2,y+h/2].



2.3.5上是在inputmanager.java中getVirtualKeyDefinitions方法中解析的:


[java]  view plain copy
  1. try {  
  2.               FileInputStream fis = new FileInputStream(  
  3.                       "/sys/board_properties/virtualkeys." + deviceName);  
  4.               InputStreamReader isr = new InputStreamReader(fis);  
  5.               BufferedReader br = new BufferedReader(isr, 2048);  
  6.               String str = br.readLine();  
  7.               if (str != null) {  
  8.                   String[] it = str.split(":");  
  9.                   if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "***** VIRTUAL KEYS: " + it);  
  10.                   final int N = it.length-6;  
  11.                   for (int i=0; i<=N; i+=6) {  
  12.                       if (!"0x01".equals(it[i])) {  
  13.                           Slog.w(TAG, "Unknown virtual key type at elem #"      + i + ": " + it[i] + " for device " + deviceName);  
  14.                           continue;  
  15.                       }  
  16.                       try {  
  17.                           VirtualKeyDefinition key = new VirtualKeyDefinition();  
  18.                           key.scanCode = Integer.parseInt(it[i+1]);  
  19.                           key.centerX = Integer.parseInt(it[i+2]);  
  20.                           key.centerY = Integer.parseInt(it[i+3]);  
  21.                           key.width = Integer.parseInt(it[i+4]);  
  22.                           key.height = Integer.parseInt(it[i+5]);  
  23.                           if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "Virtual key "  
  24.                                   + key.scanCode + ": center=" + key.centerX + ","  + key.centerY + " size=" + key.width + "x"  
  25.                                   + key.height);  
  26.                           keys.add(key);  
  27.                       } catch (NumberFormatException e) {  
  28.                           Slog.w(TAG, "Bad number in virtual key definition at region "  
  29.                                   + i + " in: " + str + " for device " + deviceName, e);  
  30.                       }  
  31.                   }  
  32.               }  
  33.               br.close();   } catch (FileNotFoundException e) {  
  34.               Slog.i(TAG, "No virtual keys found for device " + deviceName + ".");  
  35.           } catch (IOException e) {  
  36.               Slog.w(TAG, "Error reading virtual keys for device " + deviceName + ".", e);  
  37.           }  
  38.             
  39.           return keys.toArray(new VirtualKeyDefinition[keys.size()]);  
  40.       }  

实际是在inputread中使用:

 TouchInputMapper::configureVirtualKeysLocked()方法中会计算出每个虚拟按键对应的矩形范围,并将scancode转换成keycode。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值