如何区分D-pad运动和操纵杆运动?

thi*_*olr 5 android gamepad android-tv

我需要有两种不同的行为,一种用于D-pad,另一种用于模拟游戏杆(在同一游戏板上)。

问题是在onGenericMotionEvent回调上,两者在上都有相同的信息,因此MotionEvent我无法区分它们。

// d-pad
MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=-1.5259255E-5, y[0]=-1.5259255E-5, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=151637936, downTime=0, deviceId=5, source=0x1000010 }

// analog joystick
MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=0.64507514, y[0]=0.710811, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=151650802, downTime=0, deviceId=5, source=0x1000010 }
Run Code Online (Sandbox Code Playgroud)

是否可以确定正在使用哪种输入?怎么样?

小智 0

查看您提供的信息,它们看起来来自同一来源,即操纵杆(0x1000010)。您可以在输入设备对象上检查这些信息。

以下信息来自处理控制器操作

要验证连接的输入设备是否为游戏控制器,请调用getSources()以获取该设备支持的输入源类型的组合位字段。

源类型SOURCE_GAMEPAD表示输入设备具有游戏手柄按钮(例如BUTTON_A)。请注意,此源类型并不严格指示游戏控制器是否具有方向键按钮,尽管大多数游戏手柄通常具有方向控制。

源类型SOURCE_DPAD表示输入设备具有方向键按钮(例如DPAD_UP)。

源类型表示输入设备具有模拟控制杆(例如,记录沿和 的SOURCE_JOYSTICK移动的操纵杆)。AXIS_XAXIS_Y

您可能还想检查支持多个控制器输入