onTouchEvent,状态栏和画布 - 坐标系中的差异

时间:2013-06-01 12:07:50

标签: java android touch coordinates

我创建了一个自定义View 试想一下Rect的{​​{1}} 在Canvasx = 100y = 100width = 100
用亮蓝色(或任何你喜欢的颜色)

现在我切换关闭状态栏height = 100应用程序全屏运行。
试想一下,我会在矩形的中间触摸完全 coordiantes应该是-> - 正如它们应该是150, 150

但是现在我激活状态栏150, 150画布缩小了一点 ->如果你看一下屏幕,就会在状态栏下面画出-> - 这就是我想要的。
现在我再次触摸矩形中间的完全 坐标应为150px
但是...... - 耶稣! -
150, 150坐标包括状态栏高度!
onTouchEvent坐标

那么我该怎么做才能获得正确的Canvas

1 个答案:

答案 0 :(得分: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()的绿点。我已经在模拟器(我可以使用鼠标模拟“准确的”手指触摸)和真实设备中测试它。在两者中,我都可以看到红点正好在我触摸的地方绘制,绿点在红色点下方绘制(正好是状态栏的高度)。

但是如果在一个activity中处理onTouchEvent(),那么getY()和getRawY()将返回相同的值。