2

我正在使用表面面板开发游戏。我已经对如何在多个设备的画布中正确缩放和定位可绘制对象进行了大量研究,我想出了一个在手机上运行良好但在平板电脑上尝试时存在一些缺陷的解决方案。我知道我可以为平板电脑使用不同的资源(我可能最终会这样做),但现在让我们假设我不想这样做,我想为市场上的每一部不同的手机使用相同的资源.

我拥有的所有资源都位于 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 布局中使用相同的背景,则每部手机都会正确调整其大小。如果我不清楚或者我应该提供更多信息,请告诉我!

4

1 回答 1

0

在解决此问题之前,您首先要了解的是设备手机运行系统。虽然您建议手机将选择 hdpi 或其他版本,但这取决于每个手机运行的系统。

A. 尺寸拟合问题

问题是如何处理位图。尽管您使用任何数学公式重新缩放位图,但原始位图的大小对于每个不同的手机都会有不同的输出。要解决这个问题,您必须将位图的 inScaled 设置为 false。

B. 位置拟合问题

因此,您在拟合位图大小时遇到​​了问题,位图的位置将同步位置取决于您的手机屏幕尺寸。您应该定义背景对象并根据背景定位对象 x 和 y。例如,如果您想在手机屏幕中间放置一个物体,无论我们使用什么手机,代码都必须是`

canvas.drawBitmap(toDrawBitmap, background.getwidth()/2, background.getheight()/2, null);

解决拟合位置问题。

让我知道发生了什么。

于 2017-09-16T05:44:08.943 回答