在画布中调整位图大小和位置的最佳方法,使其在不同设备中看起来相同



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

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

在解决这个问题之前,您必须了解的第一件事是关于设备电话运行系统。虽然你建议手机选择hdpi或其他版本,但这取决于每部手机的运行系统。

A。尺寸拟合问题

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

B。位置拟合问题

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

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

以解决拟合位置问题。

让我知道发生了什么。

相关内容

最新更新