Android:如何正确缩放鼠标/触摸输入?

时间:2017-08-06 17:40:16

标签: java android canvas scale

我有一个安卓游戏,其中使用此代码在所有设备上缩放画布看起来相同:

canvas.scale((float)(getWidth()/(double)WIDTH), (float)(getHeight()/(double)HEIGHT))

其中WIDTHHEIGHT分别为1920和1080。我的问题是,我的所有触摸碰撞(即用户触摸形状)都是使用PathRegion来处理的:

public static boolean collided(Path a, Path b) {
    Region clip = new Region(0,0,3000, 3000);
    Region rA = new Region();
    rA.setPath(a, clip);
    Region rB = new Region();
    rB.setPath(b, clip);
    return !rA.quickReject(rB) && rA.op(rB, Region.Op.INTERSECT);
}

现在我还有另一种缩放方法(我可以告诉它几乎没有任何影响,但有时会产生影响)来缩放坐标和尺寸:

public static double scale(double x) {
    return dpToPx(x)/Resources.getSystem().getDisplayMetrics().density;
}

我的问题是,通过所有这些缩放,我似乎无法让鼠标处于正确的位置。这是我用来创建鼠标Path的代码,用于处理鼠标和其他形状之间的碰撞:

mouse.set(x, y);
mousePath.reset();
mousePath.addRect(mouse.x - 10, mouse.y - 10, mouse.x + 10, mouse.y + 10, Path.Direction.CW);

我绘制mousePath以查看mousePath的位置,这是我得到的结果(它是绿色框,鼠标实际位于蓝色圆圈的一般区域)

enter image description here

这是更严重的一点,因为我越接近(0,0),mousePath越接近鼠标实际所在的位置。

那么如何让鼠标位于正确的位置呢?

1 个答案:

答案 0 :(得分:0)

经过更多搜索后发现此问题与以下内容重复:https://stackoverflow.com/a/24895485/4188097

  

浏览器始终以未转换的坐标返回鼠标位置。您的绘图已在变换的空间中完成。如果您想知道鼠标在变换空间中的位置,可以将未转换的鼠标坐标转换为变换后的坐标,如下所示:

var mouseXTransformed = (mouseX-panX) / scaleFactor;
var mouseYTransformed = (mouseY-panY) / scaleFactor;