0

我创建了一个自定义View.
想象一下 在, , ,处Rect绘制的 亮蓝色(或任何你喜欢的颜色) Canvas
x = 100y = 100width = 100height = 100

现在我关闭->了应用程序全屏运行的状态栏。
试想一下,我会准确地触摸矩形的中间。
协调员应该是150, 150——而且他们应该是,他们是150, 150

但是现在我激活状态栏,如果你看屏幕,->画布会缩小一点,矩形被绘制在状态栏下方——这就是我想要的。 现在我再次准确地触摸矩形的中间。 协调员应该是, 但是.. -耶稣!--坐标 包括状态栏高度! 而且坐标没有
->150px

150, 150

onTouchEvent
Canvas

那么我该怎么做才能获得正确的touch coordinates呢?

4

1 回答 1

1

您使用什么方法从 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() 的绿点。我已经在模拟器(我可以使用鼠标来模拟“准确”的手指触摸)和真实设备中对其进行了测试。在两者中,我都可以看到红点恰好绘制在我触摸的位置,而绿点绘制在红色下方(恰好是状态栏的高度)。

但如果在活动中处理 onTouchEvent(),则 getY() 和 getRawY() 返回相同的值。

于 2013-06-01T12:14:56.173 回答