提问人:Samara Crawford-Hunt 提问时间:10/26/2023 更新时间:10/26/2023 访问量:26
在 onTouch MotionEvent 期间处理指针位置时出现延迟 Android Kotlin
Lag when processing pointer position during onTouch MotionEvent Android Kotlin
问:
我正在创建一个自定义视图来绘制蜡烛图。它从视图的 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 应该返回最新的指针位置,所以我不清楚这种滞后是在哪里引入的。同样有趣的是,跟踪用于平移的单次触摸事件的位置可以完美地工作。
您能给我的任何指示都非常受欢迎。
答: 暂无答案
评论