多点触控跨平台Java应用程序(Windows,Mac和Linux(Ubuntu)(可能是Android))

2022-09-03 15:55:59

我正在尝试将多点触控添加到现有的跨平台Java项目中。我已经研究了2种方式。还有其他几种方法,但它们似乎不是跨平台的,或者需要特殊的软件。

  1. JavaFx - 在Windows和osx上工作手势/触摸事件,但在Ubuntu 16.04上不起作用。
  2. MT4J - 看起来已停产和/或不受支持。

我对上述结论可能是错误的,如果得到良好的反馈,我愿意再次尝试。

有没有实现跨平台多点触控Java应用程序?似乎我可能需要编写一些本机代码并通过JNI添加它,这似乎需要做很多工作。关于这个思路的任何想法?感谢反馈,谢谢。

延续 1.0:

我一直在研究在linux上使用JavaFX,主要是因为现在使用JavaFX的唯一缺点是linux多点触控支持。我发现JavaFx多点触控确实适用于嵌入式系统的Linux发行版(例如:Raspberry Pi,可能是大多数诚实的)。我能从中收集到的是,如果OpenJFX可以为嵌入式系统编译,那么OpenJFX的嵌入式版本直接使用设备驱动程序来获取输入(/dev/input/)而不是X11/ GTK。由于桌面的Linux dist使用X11 / GTK作为输入到桌面环境中,因此由于缺乏支持,JavaFx无法获得这些事件。

我不想使用链接,但在这里它是

https://wiki.openjdk.java.net/display/OpenJFX/Building+the+OpenJFX+embedded+stack+for+Linux+desktop

至少在我看来,上面的链接是关于为x86系统编译OpenJFX的一个版本(应该工作x64),它使用嵌入式系统获取设备输入的方式。我能够编译这个版本,但是当我运行时,它似乎会使桌面崩溃,有时它确实会使Java应用程序保持打开状态。当Java应用程序保持运行时,触摸事件确实有效,但这种最终结果是不可接受的,因为它是不可预测的,并且似乎会使桌面管理器崩溃(在此之后需要重新启动桌面)。

续篇 1.1:

我考虑使用TUIO,但没有一个示例程序有效。他们说你需要一个TUIO启用设备,这可能是我的设备不使用的特殊标准/原型。几乎只是下载了TUIO演示并在触摸屏上运行它,没有运气。

我还考虑过将 xev 附加到我的 java 应用程序窗口,并将结果流式传输到一个文件,以便 java 应用程序读取该文件并将其解析为 java 事件。这似乎很笨拙,我不确定它是否有效。如果有人愿意提出这项工作的可能性,我可能会尝试一下。但在这一点上,这似乎是很多工作的方式。

续篇 1.2:

发现这个 https://bugs.openjdk.java.net/browse/JDK-8090954,觉得很有趣。

在下面发布了解决方案。


答案 1

最近出现了许多跨平台项目生成器

React native,Cordova是其中的一些

我用过 React Native。它使用根据平台编译的javascript代码

React native 支持 Gesture Control 编程

https://facebook.github.io/react-native/docs/gesture-responder-system.html

您还可以将代码的反应部分与已经编写的应用程序的现有JAVA代码进行接口

https://facebook.github.io/react-native/docs/integration-with-existing-apps.html

答案 2

解决方案是使用TUIO并滚动我们自己的Multi-Touch库。诀窍是启动TUIOClient并运行TUIO服务器。TUIOClient 侦听给定的端口,TUIO 服务器将操作系统事件转发到 TUIO 客户端正在侦听的端口。

我使用linux的mtdev2tuio服务器(输出桥),并在TUIO客户端旁边运行它。

示例流程:

1.) TUIO客户端监听端口x

2.) TUIO服务器将TUIO事件从os事件y转发到端口x

Linux:

1.) 新 TUIO客户端(3333)

2.) ./mtdev2tuio /dev/input/event5 osc.udp://127.0.0.1:3333

该解决方案并不理想,但它可以正常工作,并且应该在任何设备上支持多点触控,前提是有TUIO服务器(输出桥接器)正在运行。另一个缺点是需要捕捉触摸并将其解释为手势。另请注意,这取决于它是如何开发的,决定了你如何在不同的框架中使用它。我们的需要在Swing/JavaFX中使用。