使用 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
我在 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