android按键复用

  最近做android电视系统定制,上面安排我做一个按键板按键复用的功能:当电视的OSD菜单显示出来时按键板上的 ch+/ch- 复用为方向键上/下,vol+/vol- 复用为方向键 右/左。  OSD 菜单是使用一个Fragment实现,所以选择在 OSD 菜单显示(onResume)触发按键复用功能,在 OSD 菜单消失(onStop)时取消按键复用功能。实现的思路是合理的了,我们知道应用程序处理按键事件 KeyEvnet 通常是通过事件的keyCode值决定程序要做什么事,所以只需在处理按键函数 onKey,onKeyUp,onKeyDown 等处理按键事件前修改事件的keyCode值就可以实现按键的复用了,具体到这里就是把 KEYCODE_CHANNEL_UP/KEYCODE_CHANNEL_DOWN 改为 KEYCODE_DPAD_UP/KEYCODE_DPAD_DOWN 同样的把 KEYCODE_VOLUME_UP/KEYCODE_VOLUME_DOWN 改为 KEYCODE_DPAD_RIGHT/KEYCODE_DPAD_LEFT。 要在上面提到的函数前修改键值就需要用到 dispatchKeyEvent(KeyEvent event) 了,官方对该方法的解释是在按键事件被分发到窗口前将其拦截。好了闲话少说代码如下:  

 1 public boolean dispatchKeyEvent(KeyEvent event) {
 2         long downTime= event.getDownTime();
 3         long eventTime = event.getEventTime();
 4         int  action = event.getAction();
 5         int  code = event.getKeyCode();
 6         int repeat = event.getRepeatCount();
 7         int metaState = event.getMetaState();
 8         switch (code) {
 9         case KeyEvent.KEYCODE_CHANNEL_UP:
10                 event = new KeyEvent(downTime, eventTime, action, KeyEvent.KEYCODE_DPAD_UP, repeat, metaState);
11             break;
12         case KeyEvent.KEYCODE_CHANNEL_DOWN:
13             event = new KeyEvent(downTime, eventTime, action, KeyEvent.KEYCODE_DPAD_DOWN, repeat, metaState);
14             break;
15         case KeyEvent.KEYCODE_VOLUME_UP:
16             event = new KeyEvent(downTime, eventTime, action, KeyEvent.KEYCODE_DPAD_RIGHT, repeat, metaState);
17             break;
18         case KeyEvent.KEYCODE_VOLUME_DOWN:
19             event = new KeyEvent(downTime, eventTime, action, KeyEvent.KEYCODE_DPAD_LEFT, repeat, metaState);
20             break;
21         }
22
23         return super.dispatchKeyEvent(event);
24     }
时间: 2024-11-03 08:05:26

android按键复用的相关文章

Android 按键式事件

1. package com.fish.helloworld; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.V

Android按键事件发布流程

总结一下,Android按键事件发布流程 //InputReader.cpp void InputReader::loopOnce() { ... size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);      if (count) { processEventsLocked(mEventBuffer, count); } ...  } InputReader线程启动后,循环调用l

Android按键事件处理流程 -- KeyEvent

刚接触Android开发的时候,对touch.key事件的处理总是一知半解,一会是Activity里的方法,一会是各种View 中的,自己始终不清楚到底哪个在先哪个在后,总之对整个处理流程没能很好的把握.每次写这部分代码的时候都有些心虚, 因为我不是很清楚什么时候.以什么样的顺序被调用,大都是打下log看看,没问题就算ok了.但随着时间流逝,这种感觉一直 折磨着我.期间也在网上搜索了相关资料,但总感觉不是那么令人满意.自打开始研究Android源码起,这部分内容的分析早就 被列在我的TODO l

Android按键添加和处理的方案【转】

本文转载自:http://www.cnblogs.com/skywang12345/p/3142851.html Android按键添加和处理的方案  版本号 说明 作者 日期  1.0  Android按键添加和处理的方案 Sky Wang  2013/06/18        需求:Android机器上有个Wifi物理按键,现在需求通过点击“wifi物理按键”能够快速的开启/关闭wifi. 实现方案经过思考之后,拟出下面几种方案:方案一,在linux kernel的驱动中捕获“wifi物理按

Android中复用问题哲理性解析

Android中列表的复用机制提高了APP的运行效率,但随之而来的复用的问题总是让程序员们头痛,一个 bug找头天也找不到.我就把自己解决这方面的经验贡献出来供大家参考: 问题1:什么是复用 复用其实指的是复用View,而绑定View的数据是变化的. 问题2:复用出现的场景 在Adapter中,如果绑定View的数据的时候如果有if判断,往往很多人忘记了加else,这是大多数复用问题出现的根源. 实际场景:     比如每个item可能有或没有图片picarrList,之前我只加了if判断,如果

实现android按键震动按键声音的机制

按键的时候想要调用系统的震动服务,首先得再AndroidMainfest.xml里面加上相应的权限 <uses-permission android:name="android.permission.VIBRATE" /> 然后就是 Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); //  vibrator.vibrate(3000); // 设置Vibrate的震动周期 vibrator.

Android 按键按下实现阴影效果

final Button btn_gallery=(Button)findViewById(R.id.btn_gallery);btn_gallery.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ Intent intentgallery=new Intent(Intent.ACTION_GET_CONTENT); intentgallery.setType("image

Android提高代码复用性

对于初学者来说,当自己要实现相似的功能时候,总是复制粘贴.这样不仅增加了工作量,同时也造成了代码冗余等问题.下面,就由小言来介绍几种提高Android代码复用性的方法.(为了浅显易懂,都是举最简单的例子,假如里面有什么不对的,敬请提出改善) 1.活用include include中文翻译是包含包括的意思.最直接明显的运用的地方便是APP的标题,因为在一个APP中,其标题的格局差不多一致,每次都要复制粘贴,多麻烦.现在就来介绍一下include的简单运用. 首先,我们先举一个例子,例如在layou

[Android] hid设备按键流程简述

hexdump /dev/hidraw0就能看到usbhid设备传输过来的裸流 如:按下Input键 003ae60 0000 0096 8000 006b 0000 0000 0000 0000 * 003aea0 0000 0086 8000 0000 0000 0000 0000 0000 * 前面的估计是码流头(003ae60),还有按下(0096),松开(8000)等信息,识别按键有效信息是(006b) 006b其实是索引值,会在下表中寻找键值发送给Android,如:6b对应186