有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java onTouchEvent、状态栏和画布在坐标系中的差异

我已经创建了一个自定义View
想象一下一个Rect画在它的Canvas
x = 100y = 100width = 100height = 100
深蓝色(或任何你喜欢的颜色)

现在我关闭状态栏->应用程序正在全屏运行
试想一下,在矩形的中间,我会触摸<强>精确< /强>。br/> 坐标应该是150, 150——正如它们应该是的那样,它们是150, 150

但是现在我激活状态栏->画布缩小了一点
->如果你看屏幕,在状态栏下方150px会画一个矩形——这就是我想要的
现在我在矩形的中间再次触摸<强>精确< /强>。br/> 坐标应该是150, 150
但是<天啊--
onTouchEvent坐标包括状态栏高度
而且Canvas坐标确实不是

那么我该怎么做才能得到正确的touch coordinates


共 (1) 个答案

  1. # 1 楼答案

    您使用什么方法从MotionEvent获取x和y?你试过getRawX()和getRawY()吗

    -更新

    对不起,我想我误解了什么。你用什么方法?getY()还是getRawY()

    -再次更新-

    你是在活动中处理这件事吗?我在这里编写了一些测试代码:

    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()。我已经在emulator(我可以使用鼠标模拟“精确”的手指触摸)和真实设备中对其进行了测试。在这两种情况下,我都能看到红色圆点被精确地画在我触摸的地方,而绿色圆点则被画在红色圆点的下方(正好是状态栏的高度)

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