我正在使用表面面板开发游戏。我已经对如何在多个设备的画布中正确缩放和定位可绘制对象进行了大量研究,我想出了一个在手机上运行良好但在平板电脑上尝试时存在一些缺陷的解决方案。我知道我可以为平板电脑使用不同的资源(我可能最终会这样做),但现在让我们假设我不想这样做,我想为市场上的每一部不同的手机使用相同的资源.
我拥有的所有资源都位于 hdpi 文件夹中,并且它们的大小适合 480x800 设备。
我的方法与这里描述的类似,请看下面的解释,我想知道这个问题是否有更好的解决方案!
我有一个 Galaxy S2 用于测试我的应用程序。所以我的第一种方法是通过尝试找到所有内容的最佳位置来手动将所有内容直接插入画布中。以第一个字符位置为例:
draw_x = (float) (19);
draw_y = (float) (279);
canvas.drawBitmap(toDrawBitmap, draw_x, draw_y, null);
当我第一次在不同的设备上测试它时,一切都是一团糟,超出了规模。所以四处挖掘,我想到了使用密度来扩展资源。
// I am dividing by 1.5 because my initial positions are on a high density device
// so when it goes for a medium density it should scale for 0.66 and a small density
// for 0.5 of my positions.
float scale = getResources().getDisplayMetrics().density /1.5;
draw_x = (float) (19) * scale;
draw_y = (float) (279) * scale;
canvas.drawBitmap(toDrawBitmap, draw_x, draw_y, null);
乍一看,这就像一个魅力。我的所有角色都处于正确的位置。但我注意到,如果与我正在使用的 Galaxy S2 相比,该设备的比例宽度/高度不同,问题就开始了。尽管一切都被正确定位,但图像的一部分被从屏幕上剪下来,画布被计算得比手机屏幕大。
Galaxy S2 为 480x800。我的背景也是 480x800。当我在模拟器中以 320x480 的小屏幕分辨率对其进行测试时,Android 并没有像我预期的那样正确缩放我的背景。它没有将它缩放到正确的分辨率,而是给了我一个比我的画布 320x533 更大的背景。
通过一些简单的数学计算,我们得出 320x533 / 480x800 = 0.66。因此,它没有正确缩放画布中的背景,而是使用设备的密度进行缩放。
所以我对这个问题的解决方法是我能想到的最简单的。我知道我的背景分辨率,我知道手机的分辨率,所以我可以计算出我需要的比例并强制调整大小。
//Set the proportions for scaling in multiple devices
public void setProportions(float screenWidth,float ScreenHeight,Bitmap background){
this.heightProportion = ScreenHeight/background.getHeight();
this.widthProportion = screenWidth/background.getWidth();
}
public Bitmap scaleBitmaps(Bitmap bitmap) {
Bitmap out = Bitmap.createScaledBitmap(bitmap, (int) (bitmap.getWidth() * widthProportion),
(int) (bitmap.getHeight()*heightProportion), false);
return out;
}
这对于可绘制对象的大小来说效果很好,所以我只需要对位置做同样的事情,使用比例和这个新的比例,我可以使用固定大小的背景图像来计算
public float convertX(float x){
return x* scale * widthProportion;
}
public float convertY(float y){
return y* scale * heightProportion;
}
//calculate the positions applying the scale and the proportion
draw_x = convertX((float) (19));
draw_y = convertY((float) (279));
//draw the bitmap with the scaled position
canvas.drawBitmap(toDrawBitmap, draw_x, draw_y, null);
长话短说,为了正确定位可绘制对象,我在设备中手动设置了所需的位置,计算了密度之间的比例以及背景图像尺寸和屏幕尺寸之间的比例。为了重新调整可绘制对象的大小,我只使用了比例,因为 android 会自动应用密度比例。
我在几款不同的手机和平板电脑上进行了测试,这种方法非常适用于手机。在平板电脑上,它在重新调整可绘制对象的大小时给了我一些小错误。
最后,我的问题是,这个解决方案有什么问题?无论大小如何,我都可以让它在每部手机上运行吗?或者有更好的解决方案吗?
请注意,这对 Canvas 是严格的。如果我在 XML 布局中使用相同的背景,则每部手机都会正确调整其大小。如果我不清楚或者我应该提供更多信息,请告诉我!