在画布中调整位图和定位位图的最佳方法,使它们在不同的设备中看起来相同?

时间:2012-08-26 06:00:23

标签: android canvas surfaceview tablet

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

我拥有的所有资源都位于hdpi文件夹中,并且它们的大小适合480x800设备。

我的方法类似于here所描述的方法,请看下面的解释,我想知道是否有更好的解决方案来解决这个问题!

我有一个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;
     }

这对于drawable的尺寸工作得很好,所以我只需要对位置做同样的事情,使用比例和我使用固定尺寸背景图像计算的新比例

 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);

长话短说,为了正确定位可绘制物,我手动在设备中设置所需位置,计算密度和背景图像大小与屏幕尺寸之间的比例。 为了重新调整drawable的大小,我只使用了比例,因为android会自动应用密度标度。

我在几款不同的手机和平板电脑上进行了测试,这种方法适用于手机。在平板电脑上,它给我在重新调整可绘制的尺寸方面犯了一些小错误。

最后,我的问题是,这个解决方案有什么问题?我可以在每部手机上使用它,无论大小如何,或者有更好的解决方案吗?

请注意这对画布严格。如果我在XML布局中使用相同的背景,则会为每部手机正确调整大小。如果我不清楚或者我应该提供更多信息,请告诉我!

1 个答案:

答案 0 :(得分:0)

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

:一种。尺寸拟合问题

问题是如何处理位图。虽然您使用任何数学公式重新缩放位图,但原始位图的大小将针对每个不同的手机具有不同的输出。要解决此问题,您必须将位图的标量设置为false。

<强> B中。位置拟合问题

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

  

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

解决装配位置问题。

让我知道会发生什么。