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

时间:2017-07-01 19:37:15

标签: android coordinates screen-size screen-density

我在画布的中心绘制了两个位图: 一个只是背景,它是顶视图中的精神层面,不会移动。第二个是位图,看起来像气泡"。当用户倾斜电话时,传感器读取倾斜并且气泡根据沿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左右。

1 个答案:

答案 0 :(得分:0)

我发现了如何解决问题的一个很好的解释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