android外设按键,Android 外接键盘的按键处理

Android是默认支持键盘的,但是支持的不够好,所以需要我们自己根据自己的键盘来修改。

Android键盘的默认配置路径是sdk/emulator/keymaps

有两个最重要的文件:

qwerty.kl 默认的KeyLayout文件,是映射键盘物理矩阵的ScanCode到系统的KeyCode的一个关系。这个需要我们事先知道我们的键盘矩阵值。如果厂家不提供,就自己一个一个Log打印。

这个文件的格式,很多网络的资料都提供,可以了解下。下面只简单的说明

key 158   BACK                   WAKE_DROPPED

key 230   SOFT_RIGHT        WAKE

第一列Key 表示一行有效的开始,注释行用#开头

第二列表示Scancode ,是键盘物理设备的矩阵扫描码值

第三列表示系统里面的按键码Keycode,这样物理键盘和操作系统就对应起来了。

第四列表示KeyCode的Flag信息,可有可无,一般有三种状态

空                               没有附加信息

WAKE                         当机器处理Sleep状态,可以唤醒,按键信息继续被处理

WAKE_DROPPED        当机器处于Sleep状态,可以唤醒,但是丢弃按键信息

这里是一一映射的关系。需要根据键盘的不同来处理。

如果是正规的做法,ScanCode对应键盘值在不同的国家键盘中时不会变的,例如常用的US键盘。但是有时没有UK的矩阵,只能用US的,

这个时候就需要我们软件去更改这个ScanCode和KeyCode的映射关系。严重不推荐这种非标准化做法。

qwerty.kcm 默认的KeyCharacterMap文件。这个文件的作用就是我们在处理单独按键或者组合键的时候,系统输入显示的字符。记住这里是字符,里面以Unicode(UTF8)码值存在。这个问题困扰了我很久。

这里把一些常用的字符列出来。大家可以参考他们的Unicode值,填入到矩阵列表总即可。

下面简单的描述下这个格式:

# keycode       display number  base    caps    fn      caps_fn

A                         'A'         '2'          'a'        'A'     '#'        0x00

这里第一列KeyCode就是我们通过.kl文件的ScanCode转换过来的了。

KeyCode  提供给系统的KeyCode

display     键盘上显示的字符(丝印)

number    一般不需要

base        不使用组合键默认显示的字符

caps         Shift + 按键            显示的字符

fn             Alt    + 按键            显示的字符

caps_fn    Shift +Alt+按键      显示的字符

其中base,caps,fn,caps_fn都可以通过Unicode码制来表示。例如你可以写

'A',也可以写0x41.

一般键盘中会有很多的组合键,可能会碰见各种奇怪的字符,这里我列举以下字符,他们的Unicode可以通过

http://www.unicodemap.org/search.asp?search=

复制你所需要的字符,然后可以查询到字符对应的Unicode码制。

常用字符集合:

! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ / ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z {} ~ ¢ £ ¤ ¥§ ¨ a - ˉ ° ± 2 3 ′ μ · 1 o à á è é ê ì í D ò ó × ù ú ü Y T à á a è é ê ì í e ò ó ÷ ù ú ü y t ā ā ē ē ě ě ī ī ń ň ō ō ū ū ∥ ǎ ǎ ǐ ǐ ǒ ǒ ǔ ǔ ǖ ǖ ǘ ǘ ǚ ǚ ǜ ǜ ɑ ɡ ˇ ˉ ˊ ˋ ˙ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω Ё А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё‐ - - - ‖ ‘ ' " " ‥ ... ‰ ′ ″ ‵ ※  ̄ ℃ ℅ ℉ № ℡ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ← ↑ → ↓ ↖ ↗ ↘ ↙ ∈ ∏ ∑ ∕ ° √ ∝ ∞ ∟ ∠ ∣ ∥ ∧ ∨ ∩ ∪ ∫ ∮ ∴ ∵ ∶ ∷ ~ ∽ ≈ ≌ ≒ ≠ ≡ ≤ ≥ ≦ ≧ ≮ ≯ ⊕ ⊙ ⊥ ⊿ ⌒ 壹 二 ③ 四 伍 ⑥ 七 ⑧ ⑨ ⑩ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▓ ▔ ▕ ■ □ ▲ △ ▼ ▽ ◆ ◇ ○ ◎ ● ◢ ◣ ◤ ◥ ★ ☆ ☉ ♀ ♂、 。 〃 々 〆 〇 〈 〉 《 》 「 」 『 』 【 】 〒 〓 〔 〕 〖 〗 〝 〞 〡 〢 〣 〤 〥 〦 〧 〨 〩 ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で 之 ど な に ぬ ね の は ば ぱ ひ び ぴ 子 ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゛ ゜ ゝ ゞ ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ 兒 レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ー ヽ ヾ ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ 日 ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㈱ ㊣ ㎎ ㎏ ㎜ ㎝ ㎞ ㎡ ㏄ ㏎ ㏑ ㏒ ㏕ ︰ ︱ ︳ ︴ ︵ ︶ ︷ ︸ ︹ ︺ ︻ ︼ ︽ ︾ ︿ ﹀ ﹁ ﹂ ﹃ ﹄ ﹉ ﹊ ﹋ ﹌ ﹍ ﹎ ﹏ ﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫ ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ¢ £ ¬  ̄ ¦

真 筆 特 殊 文 字

丨 丩 丬丶 丷 丿 乀 乙 乂 乄 乆 乛 亅 亠 亻 冂 冫冖 凵 刂 讠 辶 釒 钅 阝 飠 牜 饣卩 卪 厸 厶 厽 孓 宀 川 巜 彳 廴 三 彐 彳 忄 扌 攵 氵灬 爫 犭 病 癶 礻 糹 纟 罒岡 耂 艹 虍 言 西 兦 亼 亽 亖 亗 盲 凸 凹 卝 卍 卐 匸 皕 旡 玊 尐 幵 木囘 囙 囚 四 囜 囝 回 囟 因 女 團 団 囤 亢 囦 囧 囨 雲 囪 囫 囬 園 化 囯 困 囪 囲 図 圍 掄 囶 囷 正 囹 固 囻 囼 國 圖 囿 圀 圁 圂 圃 吾 圅 圓 圇 圈 幸 青 國 圌 圍 園 圏 圐 圑 員 圓 圔 圕 圖 圗 團 圙 圚 圛 圈 圝 圞

字 符 組 合

、 ︶ㄣ ┈┾ べ_ ╄→ ^o^ ^ǒ^ ╭ァ _ _/~↘ ▄︻┻┳═壹 じò ぴé ; ┢┦ (*^﹏^*)

不仅仅是键盘,很多的输入法耶需要来处理这个动作的部分。

Android 系统的键盘事件 是由InputManagerService 来监控的, 而InputManagerService 是由 SystemServer 来启动的 创建了一个类的对象 WindowInputEvent Receiver InputEventRe ceiver的构造 函数 WindowInputEventReceiver extends InputEventReceiver nativeInit InputEventReceiver.cpp nativeInit android_view_InputE ventReceiver.cpp NativeInputE ventReceiver 的构造函数 LooperCallback: :handleEvent NativeInputEve ntReceiver::ha ndleEvent Looper::p ollInner Looper::p ollOnce NativeInputEventRecei ver : public LooperCallback 有方法 NativeInputEventReceiver:: handleEvent 没有键盘事件发生, InputManager 中的InputReader 正在睡眠等待键盘事件 的发生,而InputManager 中的 InputDispatcher 正在等待InputReader 从睡眠中醒过来并且唤醒它,而应用程 序也正在消息循环中等待InputDispatcher 从睡眠中醒过来并且唤醒它。 分析InputManager 分发键盘消息给应用程序的过程 InputReader .pollOnce EventHub.g etEvent InputReader::pr ocessEventsLock ed InputReader::pr ocessEventsForD eviceLocked InputDevic e::process 没有键盘事件发生, InputReaderThread 线程就会睡眠在EventHub.getEvent 函数 上,当键盘事件发生后,就会把这个事件封 装成一个RawEvent 对象,然后返回到 pollOnce函数中,执行此函数 有键盘事件 InputReader.cpp InputMapper::process( 这里 是KeyboardInputMapper) InputReader::createDeviceLock ed中根据类型创建的,负责处理轨迹 球事件的TrackballInputMapper 对 象以及负责处理触摸屏事件的 TouchInputMapper 对象等 KeyboardInputMap per::processKey 这个函数首先对对按 键作一些处理,例如 需要根据当时屏幕的 方向来调整键盘码 InputDispatcher::notify Key( 继承自 InputListenerInterface) KeyboardInputMappge r函数通知 InputDispatcher ,有 键盘事件发生了 1. 调用 validateKeyEvent 函数来验 证action参数是否正确 2. 参数action检查通过后,还通过 policyFlags 参数来检查一下同时是 否有ALT和SHIFT键被按下 3. 调用 enqueueInboundEventLocked 函数 把这个按键事件封装成一
Ниже представлены две части кода VBA, которые могут решить задачу: Первый код используется для создания формы расчета графика платежей по кредиту: ``` Sub СоздатьФормуРасчетаГрафикаПлатежейПоКредиту() Dim ДатаНачалаКредита As Date Dim СрокКредитаВМесяцах As Integer Dim ПроцентнаяСтавка As Double Dim СуммаКредита As Double Dim ДатаПланируемогоПлатежа As Date 'Запросить информацию у пользователя ДатаНачалаКредита = InputBox("Введите дату начала кредита (в формате ГГГГ/ММ/ДД)") СрокКредитаВМесяцах = InputBox("Введите срок кредита в месяцах") ПроцентнаяСтавка = InputBox("Введите процентную ставку по кредиту") СуммаКредита = InputBox("Введите сумму кредита") ДатаПланируемогоПлатежа = InputBox("Введите планируемую дату платежа (в формате ГГГГ/ММ/ДД)") 'Добавить заголовок таблицы Range("A1:F1").Merge Range("A1").Value = "График платежей по кредиту" Range("A1").Font.Size = 20 Range("A1").Font.Bold = True 'Добавить заголовки столбцов таблицы Range("A3").Value = "Дата платежа" Range("B3").Value = "Месяц платежа" Range("C3").Value = "Год платежа" Range("D3").Value = "Сумма платежа" Range("E3").Value = "Основной долг" Range("F3").Value = "Проценты" 'Рассчитать график платежей и заполнить таблицу Dim i As Integer For i = 1 To СрокКредитаВМесяцах Dim ДатаПлатежа As Date Dim МесяцПлатежа As Integer Dim ГодПлатежа As Integer ДатаПлатежа = DateSerial(Year(ДатаПланируемогоПлатежа), Month(ДатаПланируемогоПлатежа), 10) If i > 1 Then ДатаПлатежа = DateAdd("m", 1, Range("A" & i + 2).Value) End If МесяцПлатежа = Month(ДатаПлатежа) ГодПлатежа = Year(ДатаПлатежа) Dim СуммаПлатежа As Double Dim ОсновнойДолг As Double Dim Проценты As Double СуммаПлатежа = WorksheetFunction.Pmt(ПроцентнаяСтавка / 12, СрокКредитаВМесяцах, -СуммаКредита) ОсновнойДолг = WorksheetFunction.PPmt(ПроцентнаяСтавка / 12, i, СрокКредитаВМесяцах, -СуммаКредита) Проценты = WorksheetFunction.IPmt(ПроцентнаяСтавка / 12, i, СрокКредитаВМесяцах, -СуммаКредита) Range("A" & i + 3).Value = ДатаПлатежа Range("B" & i + 3).Value = МесяцПлатежа Range("C" & i + 3).Value = ГодПлатежа Range("D" & i + 3).Value = СуммаПлатежа Range("E" & i + 3).Value = ОсновнойДолг Range("F" & i + 3).Value = Проценты Next i 'Оформить таблицу Range("A3:F" & СрокКредитаВМесяцах + 3).HorizontalAlignment = xlCenter Range("A3:F" & СрокКредитаВМесяцах + 3).Borders.LineStyle = xlContinuous Range("A3:F" & СрокКредитаВМесяцах + 3).Font.Size = 12 Range("A3:F" & СрокКредитаВМесяцах + 3).Font.Name = "Calibri" Range("A" & СрокКредитаВМесяцах + 5).Value = "Подпись:" Range("A" & СрокКредитаВМесяцах + 7).Value = "Дата: " & Format(Date, "ГГГГ/ММ/ДД") End Sub ``` Второй код используется для привязки первого кода к кнопке "ОК" на форме: ``` Private Sub CommandButton1_Click() Call СоздатьФормуРасчетаГрафикаПлатежейПоКредиту End Sub ``` Чтобы использовать код, создайте новый Excel-файл, нажмите на кнопку "Разработчик" в меню, выберите "Вставка формы" и добавьте кнопку "ОК". Щелкните правой кнопкой мыши на кнопке "ОК" и выберите "Просмотр кода", чтобы открыть редактор VBA. Скопируйте второй код в редактор, чтобы связать его с кнопкой. Затем скопируйте первый код в редактор, чтобы создать форму расчета графика платежей по кредиту. Сохраните файл и нажмите на кнопку "ОК" для запуска формы и отображения графика платежей.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值