输入

输入用户驱动提供给app一个接口去注入事件(event)到Android Input pipeline(输入管道,个人理解就是Android的输入系统,包含触摸事件,键盘事件等),使用这个api,app能够模拟一个HID(人类接口设备,虚拟的事件触发机制,开发早期遇到过,时间太久印象不深了)或者使用外设io连接一个外置系统输入的外置硬件(键盘,游戏控制器等)。

Key Events(按键(压)事件集)

按键事件集代表了一个瞬间的按压和释放一个输入的开关(个人理解:针对按压需要作出处理,此处将事件的处理说成了一个开关)。他们用于普通按钮的输入(音量键,媒体的回退键)和键盘的按键(inputdriver只是处理了事件,真正的数据读取还得借助外设io)。Android把每一个事件都看作是一个KeyEvent对象处理。keyevent input 驱动设备的创建和注册:

  1. 使用InputDriver.Builder和源类型Source_Class_Button创建一个新的driver 实例
  2. 注册这个driver到UserDriverManager,即:

  1. 当硬件事件发生的时候,针对当前的keycode(按键码)和输入action有关的每一个状态改变创建一个新的KeyEvent。
  2. 使用emit()方法把上面创建的KeyEvent事件注入到创建的driver中,即:

  1. 当keyevent事件不再发生的时候取消掉当前的driver,即:

Motion Event(运动事件集,和上面不同的是上面只有down和up两个事件,这个有运行的事件,即move action)

输入driver也能够发射运动事件来连接一个指示设备到framework,例如触摸板和鼠标(除了按压状态,可以移动)。这个设备上报一个xy坐标的绝对位置。每一个事件包含一个press状态用来指明是不是代表在这个位置的tap(轻敲)和click(点击)事件。

注意:你必须使用正数值来上报事件发生Location的所有的坐标。

创建MotionEvent driver的步骤:

  1. 使用InputDriver.Builder和源类型Source_Touch创建一个新的driver 实例
  2. 注册这个driver到UserDriverManager,即:

  1. 当硬件事件发生的时候,使用emit()方法注入新的坐标值(注意方法的参数和Keyevent是不一样的),即:

  1. 事件不再发生的时候,解除注册,即:

对比KeyEvent和MotionEvent

keyEvent:按压事件,只有down和up两个action,多用来标识button等view的按压点击

MotionEvent:运动事件,将事件分的更为清晰,除了down和up还有move action,多用来描述移动的事件输入

处理输入的事件

Android通过各种各样的回调方法把输入事件交付给当前激活的activity,你的app通过onkeydown()和onkeyup()两个方法接受keyevent事件,其他的事件(motionevent)都是交给方法onGenericMotionevent()方法去处理,即:

Android如何处理外置设备的input事件详情可以参阅Handling Controller Actions

results matching ""

    No results matching ""