使用 x/y 坐标设置移动粒子的边界

Use x/y coordinates to set bounds of a moving particle

我在 canvas 的中心绘制了两个位图: 一个只是一个背景,它是一个不动的俯视水平仪。第二个是位图,看起来像 "air bubble"。当用户倾斜 phone 时,传感器读取倾斜度,气泡根据传感器值沿 x 轴移动。但是,我需要确保气泡不会移动太远,例如离开背景位图。 所以我尝试了气泡可以移动到哪个 x 坐标, 在我必须使用试错法设置 xPos = xPos -1 之前 这在我的设备上运行良好。

澄清一下:在我的 phone 上,气泡可以从屏幕中间移动到坐标 x = 50。这就是点,位图位于背景水平仪的最左侧。 在更大的 phone 上,位置 x = 50 太靠左了,因此看起来像气泡从水面移动出来。

现在我尝试了以下方法: 我计算了气泡可以移动的面积百分比。这么说吧 是位图整个宽度的 70%。所以我尝试计算两个x边界值:

leftBoundary = XmiddlePoint - (backgroundBitmap.getWidth() * 0.35); rightBoundary = XmiddlePoint + (backgroundBitmap.getWidth() * 0.35);

...在使用不同的屏幕尺寸进行测试时不起作用:(

是否可以使用绝对坐标来补偿不同的屏幕尺寸和密度,还是我必须重新考虑我的想法?

如果您需要我忘记的任何信息,请告诉我。如果这个问题已经得到解答,我将不胜感激 link :) 在此先感谢!

编辑: 我这样加载位图:

private Bitmap backgroundBitmap;
private static final int BITMAP_WIDTH = 1898;
private static final int BITMAP_HEIGHT = 438;

public class SimulationView extends View implements SensorEventListener{
public SimulationView(Context context){
Bitmap map = BitmapFactory.decodeResource(getResources, R.mipmap.backgroundImage);
backgroundBitmap = Bitmap.createScaledBitmap(map, BITMAP_WIDTH, BITMAP_HEIGHT, true; 
}

然后画成这样:

protected void onDraw(Canvas canvas){
canvas.drawBitmap(backgroundBitmap, XmiddlePoint - BITMAP_WIDTH / 2, YmiddlePont - BITMAP_HEIGHT / 2, null);
}

backgroundBitmap.getWidth() 和 getHeight() 打印出正确的尺寸。 像上面提到的那样计算将 return 遵循边界:

DisplayMetrics displayMetrics = new DisplayMetrics();
    ((Activity)  getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    int width = displayMetrics.widthPixels;
    //which prints out width = 2392
    xMiddlePoint = width / 2;
    // = 1196
    leftBoundary = xMiddlePoint - (BITMAP.getWidth()* 0.35);
    // = 531,7

然而,当我尝试和错误时,正确的 x 坐标似乎在 700 左右。

我遇到了关于如何解决我的问题的很好的解释 here. 正如用户 AgentKnopf 所解释的那样,您必须像这样缩放坐标或位图:

X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate

Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate

在我的例子中,翻译为:

int defaultScreenWidth = 1920;
int defaultXCoordinate = 333;
DisplayMetrics displayMetrics = new DisplayMetrics();
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
displayWidth = displayMetrics.widthPixels;
leftBoundary = (displayWidth / defaultScreenWidth) * defaultXCoordinates