如何区分方向键运动和操纵杆运动?

2024-02-17

我需要有两种不同的行为,一种用于方向键,另一种用于模拟操纵杆(在同一个游戏板上)。

问题是在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 }

是否可以识别正在使用哪种输入?如何?


我遇到了同样的问题,我必须深入研究这个有用的 Git 用户项目 https://github.com/nathanRamaNoodles/Tinker-Controller弄清楚他是怎么做到的。区分不同操纵杆(和方向键)的方法是使用每个方向的特定axis.

如果您阅读了Android 文档页面 https://developer.android.com/training/game-controllers/controller-input非常仔细地(我没有注意到它),它确实展示了如何区分各种操纵杆及其方向:

此图显示左操纵杆使用轴AXIS_X and AXIS_Y,而右操纵杆使用AXIS_Z和和AXIS_RZ。对于方向键,我使用了轴_HAT_X and 轴_HAT_Y。我的代码(Kotlin 中)中的以下片段展示了如何单独访问其中的每一个:

注意:我还将搜索栏设置为 0-100 范围,这就是为什么我将转换数学放在底部processJoystickInput().

private fun processJoystickInput(event: MotionEvent, historyPos: Int) {

    val inputDevice = event.device

    val newJoystickValues = floatArrayOf(
            getCenteredAxis(event, inputDevice, MotionEvent.AXIS_X, historyPos),
            getCenteredAxis(event, inputDevice, MotionEvent.AXIS_Y, historyPos),
            getCenteredAxis(event, inputDevice, MotionEvent.AXIS_Z, historyPos),
            getCenteredAxis(event, inputDevice, MotionEvent.AXIS_RZ, historyPos),
            getCenteredAxis(event, inputDevice, MotionEvent.AXIS_HAT_X, historyPos),
            getCenteredAxis(event, inputDevice, MotionEvent.AXIS_HAT_Y, historyPos))

    // Update based on the new x and y values
    val throttleSeekBar = findViewById<SeekBar>(R.id.throttle_seekBar)
    val yawSeekBar = findViewById<SeekBar>(R.id.yaw_seekBar)
    val pitchSeekBar = findViewById<SeekBar>(R.id.pitch_seekBar)
    val rollSeekBar = findViewById<SeekBar>(R.id.roll_seekBar)
    val dpadXSeekBar = findViewById<SeekBar>(R.id.dpadX_seekBar)
    val dpadYSeekBar = findViewById<SeekBar>(R.id.dpadY_seekBar)

    // Convert the float range (-1.00 to 1.00) to Int (0 to 100)
    yawSeekBar.progress = ((newJoystickValues[0] + 1) * 50).toInt()
    throttleSeekBar.progress = ((newJoystickValues[1] + 1) * 50).toInt()
    rollSeekBar.progress = ((newJoystickValues[2] + 1) * 50).toInt()
    pitchSeekBar.progress = ((newJoystickValues[3] + 1) * 50).toInt()
    dpadXSeekBar.progress = ((newJoystickValues[4] + 1) * 50).toInt()
    dpadYSeekBar.progress = ((newJoystickValues[5] + 1) * 50).toInt()
}

override fun onGenericMotionEvent(event: MotionEvent): Boolean {
    // Check that the event came from a game controller

    return if (event.source and(InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK
            && event.action == MotionEvent.ACTION_MOVE) {

        // Process the movements starting from the
        // earliest historical position in the batch
        (0 until event.historySize).forEach { i ->
            // Process the event at historical position i
            processJoystickInput(event, i)
        }

        // Process the current movement sample in the batch (position -1)
        processJoystickInput(event, -1)
        true
    } else {
        super.onGenericMotionEvent(event)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何区分方向键运动和操纵杆运动? 的相关文章

  • 在 Android 上通话结束时启动活动

    我想在通话结束时启动一项活动 找不到任何对此的参考 我该怎么做 我还没有尝试过这个 但我假设你可以运行一些服务 始终在后台运行 它利用电话状态监听器 http developer android com reference android
  • Android 中多个蓝牙连接的自定义 UUID

    我有一个 Android 设备作为服务器连接到多个蓝牙 Android 客户端 我了解 UUID 的概念以及它的独特之处 我的问题是 我可以为连接到我的服务器的所有客户端使用相同的 UUID 吗 如果没有 我如何以编程方式为我的客户端生成
  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • 发布的 Android apk 出现错误“包文件未正确签名”

    我最近将我的应用程序上传到 Android 市场 但是由于错误 下载时它拒绝运行 包文件未正确签名 我首先使用 eclipse 发布了数据包 右键单击导出 创建密钥库然后发布 但它拒绝工作 然后我下载了 keytool 和 jarsigne
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • Ember.js - 错误 - “断言失败:您必须在传递给‘push’的哈希中包含‘id’”

    通过使用 Express 编写的 REST API 将帖子 标题 文本 保存到 mongodb 数据库并刷新浏览器后 我收到此错误 我已经将主键设置为 id 并且一直在阅读有关可能规范化数据的内容 这是来自服务器的有效负载 数据库中只有 1
  • ESPN Cricinfo 有 API 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Has espncricinfo com http espncricinfo com暴露API 我对实时
  • 如何通过反射从名称获取类型表示?

    有没有办法使用反射库 https golang org pkg reflect 在 Go 中从类型名称转到它的类型Type https golang org pkg reflect Type表示 我有一个库 用户需要为某些代码生成提供类型表
  • TS2304:找不到名称要求和进程

    When I want to start my angular 2 app using npm start I get errors 我从互联网上尝试了很多 解决方案 但没有任何效果 我的版本 npm 4 1 2 打字 2 1 0 节点 7
  • 如何使用 CallKit 进行非 voip 呼叫?

    我想使用新的 iOS 10 CallKit 但使用默认运营商从应用程序拨打电话 是否可以 如果是这样 怎么办 目前使用 public void dial String number NSURL url new NSURL tel numbe
  • iOS:以编程方式检测iOS应用程序安装的来源(在已安装的应用程序内)[重复]

    这个问题在这里已经有答案了 我想知道是否有办法检测用户如何在 AppStore 中找到我的应用程序 例如 如果有一些参数 我可以将其连接到 AppStore 中我的应用程序的 URL 并将其获取到已安装的应用程序中 有可能http itun
  • 搜索“整个解决方案”停止工作

    不知何故 Visual Studio 搜索已停止为我工作 每当我搜索 整个解决方案 中的某些文本时 我都会得到以下结果 查找所有 我正在搜索的内容 子文件夹 查找结果 1 整个解决方案 找不到要查找的匹配文本 查找为 停止进行中 为什么突然
  • Magento 按小数排序属性而不是按字母数字排序

    所以我疯狂地在谷歌上搜索 试图找到一个解决这个问题的方法 该方法实际上可以正常工作 但却空手而归 使用类别页面上的 排序依据 功能按属性 容量 重量等 对产品进行排序时 Magento 像这样排序 因为它认为数字是文本字符串 产品A 10公
  • 无法让 EclipseLink MOXy 工作

    我是 JAXB 新手 我想使用 EclipseLink MOXy 更改默认名称空间前缀 我的 package info java 有以下代码行 javax xml bind annotation XmlSchema namespace ht
  • Chrome自动设置输入格式=数字

    我有一个 Web 应用程序 我使用 HTML5 属性 type number 将输入字段指定为数字
  • 如何将主干视图连接到流星车把模板?

    看起来像 Backbone view meteor 和 handbars 在操作 DOM 的一部分时具有重叠功能 我查看了 ToDo 应用程序 它应该使用 Backbone 但实际上 他们只使用路由器 主干视图也处理模板 但它们听起来与流星
  • 有没有办法限制“git gc”使用的内存量?

    我在共享主机上托管 git 存储库 我的存储库中必然有几个非常大的文件 每次我尝试在存储库上运行 git gc 时 我的进程都会因使用过多内存而被共享托管提供商杀死 有没有办法限制 git gc 可以消耗的内存量 我希望它可以用内存使用来换
  • VB6下载网页源码

    VB6 有没有办法将网页源下载到字符串或文本框 例如 在 VB Net 中 WebClient 类允许您使用 DownloadString google com 执行此操作 我如何在 vb6 中执行相同操作 注意 我想避免使用网络浏览器 我
  • WPF 应用程序的异常报告

    在未处理的异常期间 是否有某种方法可以捕获输出并在应用程序崩溃时显示错误报告对话框 我的想法是在后台运行一个小程序 它唯一的工作就是监听主应用程序的异常退出 然后显示 报告 对话框 用户可以选择通过电子邮件向我发送错误的输出 不太确定如何实
  • 确保给定的 docker 容器正在运行

    我现在在很多服务器上使用 docker 但有时我使用的一些容器由于负载过重而崩溃 我正在考虑添加一个 cron 来检查容器的每一分钟是否正在运行 但我没有找到任何令人满意的方法 我使用 cidfile 启动容器 该文件保存正在运行的容器的
  • 如何恢复netbeans中修改过的文件?

    我正在从事一个重要的项目 我修改了一些 php 和 css 文件并上传主题 然后 我删除了缓存 该项目不起作用 我想在第一次修改时恢复文件 有办法吗 请原谅我的英语 您没有说明您正在使用哪个版本的 Netbeans 但如果它是最新版本 您可
  • Visual Studio 2010 - 卸载 NuGet

    如何从 Visual Studio 2010 中卸载 NuGet 我尝试使用 以管理员身份运行 打开 Visual Studio 2010 但 卸载 选项不可用于从 VS2010 卸载 NuGet 扩展 通常要在VS2010中卸载NuGet
  • 解析模块说明符“vue”时出错。相对模块说明符必须以“./”、“../”或“/”开头

    我正在尝试使用代码让基本的 VueJS 应用程序运行 div div
  • 如何添加 Visual Studio 2013 Scaffolding 中使用的新 Scaffold?

    有没有办法添加新的脚手架或覆盖新的 Visual Studio 2013 脚手架中使用的脚手架功能 我在互联网上能找到的唯一文档是如何使用 CodeTemplates 文件夹覆盖 T4 模板 我想在添加 gt 新脚手架项 时向列表添加一个新
  • 如何区分方向键运动和操纵杆运动?

    我需要有两种不同的行为 一种用于方向键 另一种用于模拟操纵杆 在同一个游戏板上 问题是在onGenericMotionEvent回调 两者都有相同的信息MotionEvent我无法区分它们 d pad MotionEvent action