0

我在画布的中心绘制了两张位图:一张只是背景,它是顶视图中的水平仪,不会移动。第二个是看起来像“气泡”的位图。当用户倾斜手机时,传感器会读取倾斜度,气泡会根据传感器值沿 x 轴移动。但是,我需要确保气泡不会移动太远,例如超出背景位图。所以我尝试了气泡可以移动到哪个 x 坐标,然后我必须使用反复试验设置 xPos = xPos -1 这在我的设备上运行良好。

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

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

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

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

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

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

编辑:我像这样加载我的位图:

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() 打印出正确的尺寸。如上所述的计算将返回以下边界:

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 左右。

4

1 回答 1

0

我在这里遇到了关于如何解决我的问题的很好的解释 正如用户 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
于 2017-07-03T22:47:02.157 回答