在 onTouch MotionEvent 期间处理指针位置时出现延迟 Android Kotlin

Lag when processing pointer position during onTouch MotionEvent Android Kotlin

提问人:Samara Crawford-Hunt 提问时间:10/26/2023 更新时间:10/26/2023 访问量:26

问:

我正在创建一个自定义视图来绘制蜡烛图。它从视图的 onTouch 事件中的多点触控指针位置读取值,以计算两个指针之间的距离并放大或缩小。我选择使用这种方法而不是手势检测,因为它使我能够更精细地控制计算,允许我分别处理 X 轴和 Y 轴的变化(这是我的图表运行所必需的)。

这就是它变得奇怪的地方 - 它的两根手指缩放部分似乎有一个滞后,特别是:

向一个方向放大并释放效果很好,但是如果您在相同的拖动事件中改变方向,则会出现超调,尽管您开始以另一种方式缩放,但它会像以前一样继续移动几个事件步骤,然后逐渐校正,然后赶上您的手指。这使得缩放成为可能,但有点“海绵状”和无反应性。

我在这里错过了什么?

来自 onTouch 事件的片段:

if(event.action == MotionEvent.ACTION_MOVE && event.pointerCount == 2){ 
    val touchA = PointF(
        event.getX(0),
        event.getY(0)
    )
    val touchB = PointF(
        event.getX(1),
        event.getY(1)
    )
        if (trackingZoom) {
            val zoomDistanceHChange = (startZoomHDistance - abs(touchA.x - touchB.x)) * ptPerPX(Orientation.HORIZONTAL)
            val zoomDistanceVChange = (startZoomVDistance - abs(touchA.y - touchB.y)) * ptPerPX(Orientation.VERTICAL)
           // ^^ Translates touch position into chart units so that things move the correct distance relative to your finger.

            moveView(startZoomViewRect.left - zoomDistanceHChange/2F, startZoomViewRect.top - zoomDistanceVChange/2F, startZoomViewRect.width() + zoomDistanceHChange, startZoomViewRect.height() + zoomDistanceVChange)
            // ^^ Moves and rescales the chart, drawing the changes to the view.

        }else{
            startZoomViewRect = viewRect
            // ^^ viewRect is a RectF instance describing the currently viewed area of the chart.

            startZoomHDistance = abs(touchA.x - touchB.x)
            startZoomVDistance = abs(touchA.y - touchB.y)
            trackingZoom = true
        }
}

据我所知,文档建议 event.getX 应该返回最新的指针位置,所以我不清楚这种滞后是在哪里引入的。同样有趣的是,跟踪用于平移的单次触摸事件的位置可以完美地工作。

您能给我的任何指示都非常受欢迎。

Android Kotlin 事件 触摸 多点触控

评论

0赞 Ivan Abakumov 10/26/2023
当您用两根手指同时触摸屏幕时,是否会发生延迟?
0赞 Samara Crawford-Hunt 10/26/2023
你好!是的 - 这是唯一一次发生延迟。刚刚制作了一个动画 gif,所以更清楚:imgur.com/SP7Pfbz
0赞 Ivan Abakumov 10/26/2023
试这段代码。此代码计算每个MotionEvent.ACTION_MOVE的两个指针之间的距离,然后根据初始距离计算比例因子。这应该允许更平滑的缩放。
0赞 Samara Crawford-Hunt 10/26/2023
有趣。这完美地解决了滞后问题,谢谢!- 我仍然希望能够让用户在一个动作中更改水平和垂直比例(而不是像您的片段一样按比例更改两者),但我认为您已经给了我足够的时间来确定故障所在。我会玩一出,让你知道。
0赞 Samara Crawford-Hunt 10/26/2023
固定!我在将触摸移动转换为图形单位的代码部分有一个错误 - 您的代码允许我突出显示它的确切位置。谢谢。imgur.com/V3Gvogs

答: 暂无答案