【问题标题】:Android: MotionEvent Need some clarification of GetHistoricalX and GetHistoricalYAndroid:MotionEvent 需要对 GetHistoricalX 和 GetHistoricalY 做一些说明
【发布时间】:2016-09-06 21:55:50
【问题描述】:

在我的应用程序中,我需要通过触摸在视图上绘制笔触。触地和触动移动时(处理触动移动后),我必须保存以前的坐标。当我查看 API 时,有 GetHistoricalX 和 GetHistoricalY。

1) 这些历史数据是如何工作的。它们会被删除吗?

2) 是否会在触摸开始移动时开始保留所有历史数据?

因为我使用了同样适用于 IOS 的 Xamarin Form。 IOS有没有和这个一样的东西。

【问题讨论】:

    标签: android xamarin move touch-event


    【解决方案1】:

    安卓:

    在 Android 上,GetHistoricalX|Y 将包含自上次 ACTION_MOVE 事件以来报告的 X/Y(即,为了提高效率,这被批处理到单个触摸事件中)。

    只有在比批次中的当前坐标更早的情况下,坐标才是“历史的”;但是,它们仍然不同于先前运动事件中报告的任何其他坐标。要按时间顺序处理批次中的所有坐标,先消耗历史坐标,再消耗当前坐标。

    注意:由于没有为/dev/input/event0 定义标准输入采样率,因此该速率由硬件开发人员以及他们的数字化仪网格驱动程序的编写/配置方式决定。然后,Android 将收集可用样本的数量,并在历史数据中将这些样本与最新的 X/Y 样本一起提供给开发人员。如果每个人都知道如何从操作系统获得这个频率,我很想知道 ;-)

    您可以使用GetHistorySize 获取可用“点”的数量,首先处理它们,然后处理当前的 X/Y,但请记住,这些只是自上次移动批处理事件以来的位置。

    Batching部分下有示例Java代码@https://developer.android.com/reference/android/view/MotionEvent.html

    iOS:

    在 iOS 上,报告的触摸事件数基于其数字化仪的 60hz 采样率。一些 iDevice 的频率更快(较新的 iPad 为 120hz,iPad Pro 为 240hz)。这些“额外”点在coalescedTouchesForTouch 方法中报告 (Xamarin.iOS = GetCoalescedTouches)。

    注意:iOS 甚至有predictedTouchesForTouch (Xamarin.iOS = GetPredictedTouches),可能UIEvent 中可用。这些可用于“预绘制”用户可能移动到的位置,Apple 在使用 Apple Pencil 以防止铅笔尖端出现视觉“滞后”时提供了此开发代码示例...

    净结果:

    最后,如果您需要保留 X/Y 触摸位置的历史记录以便重放它们,您需要自己存储这些,因为 iOS 或 Android 都不会在触摸事件之外缓冲这些。

    【讨论】:

    • 是的,我已经尝试过历史数据,现在可以生成平滑曲线。我想我想对它们进行采样,但不知道该怎么做,因为我认为我们不需要存储每一个触摸动作来产生贝塞尔曲线。
    • 你知道有什么好的算法可以最好地存储遍历和插入好的点吗? At the moment, I made a QuadTree which partition the space into 4 area when the eraser button selected: Top left, top right, Button left and Bottom Right but to create this tree is quite expensive for that numerous of points in my scenerio.
    • @Simon 这完全取决于最终结果需要是什么,有 RDP 算法和许多变体)来简化曲线中的点数并获得“相似”的结果。 QuadTree 可能是您的用例所需要的...我发现简单的 C# 排序列表在某些情况下足够快,我使用八叉树并将触摸压力存储为 Z-坐标等,将您尝试实现的示例发布到 StackOverflow 的 C# 和算法标签会很好地了解您的需求。
    • 我看到一个人有一个 Surface Pro(我认为那是一个 Surface Pro),他向我展示了办公室或其他一些应用程序。他用手写笔画了一些笔触,然后将其删除。这就是我想要达到的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2021-09-28
    • 2014-10-02
    • 2016-06-16
    • 2013-08-16
    • 2023-04-01
    相关资源
    最近更新 更多