java - onTouchEvent、状态栏和 Canvas ——坐标系的差异

标签 java android touch coordinates

我创建了一个自定义 View
想象一下在其 Canvas 上绘制的 Rect
x = 100y = 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/

相关文章:

java - 使用 boolean 字段的评估上下文进行 Spring 表达式解析

java - 为什么java streams跳过方法强制执行其他操作

c# - 如何在 C# 中确定系统是否支持触摸

移动设备上的 Facebook 请求对话框失败

touch - iPad 上的 Kinetic JS touchstart/touchend 混淆

Java顺序实现比并行实现快4倍

javascript - 对 GWT 生成的文件感到困惑

java - 在 onCreate inputfilter 中使用 void 的值

android - 进度条 Activity 强制关闭

java - 应用带有 View 的选项卡而不是单独的 Activity