我创建了一个自定义 View
。
想象一下在其 Canvas
上绘制的 Rect
x = 100
、y = 100
、宽度 = 100
、高度 = 100
亮蓝色(或任何您喜欢的颜色)
现在我关闭状态栏->
应用程序正在全屏运行。
想象一下,我会恰好触摸矩形的中间。
坐标应为 150, 150
- 正如它们应该的那样,它们是 150, 150
。
但现在我激活状态栏->
Canvas 缩小了一点
->
如果你看屏幕,矩形会在状态栏下方绘制 150px
——这就是我想要的。
现在我再次恰好触摸矩形的中间。
坐标应为 150, 150
,
但是.. -- 天啊! --
onTouchEvent
坐标包括状态栏高度!
而 Canvas
坐标则不会!
那么我该怎么做才能获得正确的触摸坐标
?
最佳答案
您使用什么方法从 MotionEvent 获取 x 和 y?您尝试过 getRawX() 和 getRawY() 吗?
---更新--
抱歉,我想我误解了一些东西。你用了什么方法? getY() 还是 getRawY()?
---再次更新---
你在Activity中处理onTouchEvent吗?这里我写了一些代码进行测试:
public class CustomView extends View {
private final Paint p = new Paint();
private final Paint p2 = new Paint();
private float lastRawX = 0, lastRawY = 0;
private float lastX = 0, lastY = 0;
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
p.setColor(0xFFFF0000);
p2.setColor(0xFF00FF00);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
lastX = event.getX();
lastY = event.getY();
lastRawX = event.getRawX();
lastRawY = event.getRawY();
invalidate();
return true;
}
@Override
protected void onDraw(Canvas canvas) {
// make the touch point big enough to be noticed.
canvas.drawCircle(lastX, lastY, 3, p);
canvas.drawCircle(lastRawX, lastRawY, 3, p2);
}
}
红点表示 getY(),绿点表示 getRawY()。我已经在模拟器(我可以使用鼠标来模拟“准确”的手指触摸)和真实设备中对其进行了测试。在这两种情况下,我都可以看到红点恰好绘制在我触摸的位置,绿点绘制在红点下方(恰好是状态栏的高度)。
但是如果在 Activity 中处理 onTouchEvent(),则 getY() 和 getRawY() 返回相同的值。
关于java - onTouchEvent、状态栏和 Canvas ——坐标系的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16872538/