android - 如何将 MotionEvents 发送到 Android?

标签 android keyevent motionevent joystick gamepad

我正在尝试开发一个 Virtual Gamepad,但在向 Android 发送输入和事件时遇到很多问题,尤其是 MotionEvents。我有一个设备,并且应用程序存储在 /system/app 中,需要将事件发送到系统,但我无法在我用于测试的应用程序中接收它们。这是我发送 MotionEvent 的代码:

 val event = MotionEvent.obtain(
     0,
      SystemClock.uptimeMillis(),
      MotionEvent.ACTION_MOVE,
     sThumbLX.toFloat() / 32000, sThumbLY.toFloat() / 32000 * -1,
     1.0f,
     1.0f,
     0,
     1.0f,
     1.0f,
     3,
     0
 )
 event.source = InputDevice.SOURCE_JOYSTICK
  Timber.v("new thumb event send %s", event.toString())
 instrumentation.sendPointerSync(event)
 event.recycle()


相反,当我使用真正的游戏 handle 时,我会收到许多类似以下的事件:

2019-09-12 15:29:50.576 4555-4555/it.eng.ds.poc.gamepadtestapplication V/EVENT: Event type [Motion] - x [1.0 y [-0.003921509] event [MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0, x[0]=1.0, y[0]=-0.003921509, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=2, eventTime=1437191, downTime=0, deviceId=5, source=0x1000010 }]
2019-09-12 15:29:50.576 4555-4555/it.eng.ds.poc.gamepadtestapplication V/EVENT: Event type [Down] - code [22] event [{KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_DPAD_RIGHT, scanCode=0, metaState=0, flags=0x400, repeatCount=0, eventTime=1437191, downTime=1437191, deviceId=5, source=0x1000010 }}]
2019-09-12 15:29:51.016 4555-4555/it.eng.ds.poc.gamepadtestapplication V/EVENT: Event type [Motion] - x [0.85882366 y [-0.003921509] event [MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0, x[0]=0.85882366, y[0]=-0.003921509, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=1437627, downTime=0, deviceId=5, source=0x1000010 }]
2019-09-12 15:29:51.036 4555-4555/it.eng.ds.poc.gamepadtestapplication V/EVENT: Event type [Motion] - x [0.27058828 y [-0.003921509] event [MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0, x[0]=0.27058828, y[0]=-0.003921509, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=3, eventTime=1437651, downTime=0, deviceId=5, source=0x1000010 }]
2019-09-12 15:29:51.036 4555-4555/it.eng.ds.poc.gamepadtestapplication V/EVENT: Event type [Up] - code [22] event [{KeyEvent { action=ACTION_UP, keyCode=KEYCODE_DPAD_RIGHT, scanCode=0, metaState=0, flags=0x400, repeatCount=0, eventTime=1437651, downTime=1437651, deviceId=5, source=0x1000010 }}]
2019-09-12 15:29:51.056 4555-4555/it.eng.ds.poc.gamepadtestapplication V/EVENT: Event type [Motion] - x [0.003921628 y [-0.003921509] event [MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0, x[0]=0.003921628, y[0]=-0.003921509, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=1437663, downTime=0, deviceId=5, source=0x1000010 }]

我遵循的是正确的方法还是这不是正确的方法?

谢谢。

最佳答案

你走的路是对的。您在 logcat 中看到 id[0] 了吗?

  1. 这是因为 OS 使用更复杂的其他方式初始化(​​获取)其 MotionEvent 对象。
  2. 您的游戏 handle 输出仅显示 id=0 的坐标,这意味着屏幕上只有一个指针。

尝试另一种方法,传递 pointerProperties[]pointerCoords[]。在数组中,你必须为所有指针(包括所有指针 id)指定你现在在屏幕上的所有触摸。您的游戏 handle 输出仅显示 id=0 的坐标,这意味着屏幕上只有一个指针。

此外,如果您想在 logcat 中查看您的 motionEvent,请使用日志记录,或者您可以覆盖方法 onGenericMotionEvent() onTouchEvent(),您将能够在它们上设置断点并调查传入的 MotionEvent

关于android - 如何将 MotionEvents 发送到 Android?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57908151/

相关文章:

java - KeyEvent 没有触发?

java - 如何仅在特定时间调用函数

android - 从 View 长按触发 DOWN 事件时从对话框注册 UP/CANCEL

android - 您的项目包含错误,请在运行前修复它

android - 带有 Android 64 Bundle 的 Ubuntu 64 找不到 adb 可执行文件

java - KeyPressed 事件没有发生?

java - 正确使用 MotionEvent.ACTION_HOVER_EXIT?

android - 如何保持 ExpandableListView 处于展开状态?

java - Android Textview 中的固定列

java - 使用 KeyEvent 时遇到问题