onTouchEvent
和 onDraw
中 MotionEvent.getX()
结果不一样的原因主要在于它们处理触摸事件的时机和上下文不同。
onTouchEvent
中获取的坐标是相对于整个屏幕的,而 onDraw
中获取的坐标是相对于当前视图的。如果视图有父视图或者其他变换(如平移、缩放),这些坐标可能会有所不同。onTouchEvent
是在事件传递链的早期被调用的,而 onDraw
是在视图需要重绘时被调用的。在这两个时间点,触摸事件的坐标可能已经发生了变化。如果你需要在 onDraw
中使用与 onTouchEvent
相同的坐标,可以通过以下方式转换坐标:
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX(); // 获取相对于视图的X坐标
// 处理触摸事件...
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 假设你需要在onDraw中使用onTouchEvent中获取的x坐标
// 你可以将屏幕坐标转换为视图坐标
float xInViewCoordinates = getX() + event.getX(); // event.getX()是从onTouchEvent中获取的
// 使用转换后的坐标进行绘制...
}
onDraw
中使用触摸事件的坐标来精确地绘制图形或响应用户的操作。onTouchEvent
中正确处理并消费事件,以避免事件被传递到其他视图。通过理解这些基础概念和机制,你可以更好地处理触摸事件,并在不同的回调方法中准确地使用坐标信息。
领取专属 10元无门槛券
手把手带您无忧上云