我正在尝试开发一个 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]
了吗?
- 这是因为
OS
使用更复杂的其他方式初始化(获取)其MotionEvent
对象。 - 您的游戏 handle 输出仅显示
id=0
的坐标,这意味着屏幕上只有一个指针。
尝试另一种方法,传递 pointerProperties[]
和 pointerCoords[]
。在数组中,你必须为所有指针(包括所有指针 id)指定你现在在屏幕上的所有触摸。您的游戏 handle 输出仅显示 id=0
的坐标,这意味着屏幕上只有一个指针。
此外,如果您想在 logcat
中查看您的 motionEvent
,请使用日志记录,或者您可以覆盖方法 onGenericMotionEvent()
和 onTouchEvent()
,您将能够在它们上设置断点并调查传入的 MotionEvent
。
关于android - 如何将 MotionEvents 发送到 Android?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57908151/