2010-11-10 132 views
2

我正在尝试创建的应用程序是棋盘游戏。它将有一个位图作为棋盘和棋子,移动到棋盘上的不同位置。该板的一般设计是方形的,具有一定数量的行和列,并具有用于外观的边框。想象一下国际象棋棋盘或拼字游戏板。Android - 确定不同分辨率的位图上的特定位置(X,Y坐标)?

在使用位图之前,我首先通过手动绘制它来创建电路板和寄存器 - drawLine & drawRect。我决定了边框的宽度有多少像素基于“onSizeChanged”中传递的屏幕宽度和高度。剩余的屏幕除以我需要的列数或行数。

对于实施例起见,让我们说,屏幕尺寸是102 X 102

我可能选择在1设置边界并设置行数在10 &列这将使100×100个左(减去两个以考虑顶部&底部边界以及左/右边界)。然后将列和行设置为10,这将为高度和宽度留下10个像素。

无论通过哪种屏幕尺寸,我都会存储寄存器宽度的多少个像素以及电路板上每个方块的高度&。我确切地知道在屏幕上根据简单的公式确定屏幕上的什么位置,并且我确切地知道用户触摸什么单元格来进行移动。

现在如何与位图一起工作?这意味着,如果我为每个密度创建3个不同的背景位图,它们是不是会调整大小以适合每个设备的屏幕分辨率,因为从我读的内容来看,不仅有3种屏幕分辨率,而且现在有平板电脑 - 更多。如果我或Android向上或向下缩放位图以适应当前设备的屏幕尺寸,我如何知道边框的缩放范围以及每个方块的尺寸,以便确定移动某个部分的位置或计算玩家的位置感动。到目前为止,我看过的例子只是展示了如何缩放整体位图并获得整体位图宽度和高度。但是,我没有看到如何判断电路板的每个部分在缩放之后会有多少像素宽或高。当我根据onSizeChanged的屏幕尺寸绘制每一行和矩形时,我总是知道这些尺寸。

如果任何人有任何示例代码或URL指向我,我可以就这个问题与位图的读取,我将不胜感激。

顺便说一句,这里有一些关于如何知道我的游戏板(边框和正方形)尺寸的示例代码(非常简化),无论屏幕尺寸如何。现在我只需要知道如何将这个与电路板做成一个可以缩放到任何屏幕尺寸的位图。


@Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     intScreenWidth = w; 
     intScreenHeight = h; 

     // Set Border width - my real code changes this value based on the dimensions of w 
     // and h that are passed in. In other words bigger screens get a slightly larger 
     // border. 
     intOuterBorder = 1; 

     /** Reserve part of the board for the boardgame and part for player controls & score 
      My real code forces this to be square, but this is good enough to get the point 
      across. 
     **/ 
     floatBoardHeight = intScreenHeight/4 * 3; 

     // My real code actually causes floatCellWidth and floatCellHeight to 
     // be equal (Square). 
     floatCellWidth = (intScreenWidth - intOuterBorder * 2)/intNumColumns; 
     floatCellHeight = (floatBoardHeight - intOuterBorder * 2)/intNumRows; 

     super.onSizeChanged(w, h, oldw, oldh); 
    } 


我想我找到了答案。我可能无法在单个缩放位图中找到每个可播放方块的确切宽度/高度和位置,但通过查看SDK中的Snake示例,我发现它不会为整个板创建1个位图,并且可以缩放它基于屏幕尺寸 - 相反,它会为每个图块创建一个位图,然后根据屏幕分辨率和屏幕上需要的图块数量来缩放图块 - 就像我手动绘制图板时一样。使用这种方法,我应该能够找到板上所有可玩方块的确切像素边界。我只需要将棋盘分成多个方块的位图。我可能将不得不为边界做类似的处理,所以我可以在缩放之后检测它们的宽度/高度。

现在我将测试它来验证,但我期望它能够基于我在Snake SDK示例中看到的工作。

--Mike


我测试的方式做什么,我是问,它似乎工作。以下是我所做的:

我为电路板创建了一个320 x 320位图。它由边框和方块组成(像棋盘)。边框的宽度一直是10个像素。正方形是20 x 20像素。

我通过onSizeChanged检测到屏幕的宽度和高度。在480×800的显示,我将设置新的宽度为主板是480×480,并使用下面的代码来缩放整个事情:


protected void onSizeChanged(int w, int h, int oldw, int oldh) {   
    floatBoardWidth = w; 
    floatBoardHeight = floatBoardWidth; 

    bitmapScaledBoard = Bitmap.createScaledBitmap(bitmapBoard, (int)floatBoardWidth, (int)floatBoardHeight, true);  

     super.onSizeChanged(w, h, oldw, oldh); 
} 

现在,为了检测多少个像素宽的边界被缩放到了多少个像素,并且正方形的宽度是多少,我首先计算了整个图像的缩放比例。我知道该位图是320 x 320,因为我创建了它。我用下面的公式来计算图像的缩放比例:

floatBoardScale = floatScreenWidth/320;

对于480宽度的屏幕,floatBoardScale等于:1.5。然后为了计算我的边界在完整位图内的比例,我做了:

floatBorderWidth = 10 * floatBoardScale;

10是我的320 x 320位图中的原始边框宽度。在我的最终代码中,我不会硬编码值,我会使用变量。无论如何,在这个公式的情况下,新的计算出的边框宽度应该是:15

当我将相同的比例因子乘以棋盘格(原始位图中的20 x 20)时,我得到了30 x 30.当我在公式中使用这些值来计算一个人碰到什么平方时,它就起作用了。我触摸广场的每个角落,并在中心,并始终计算出正确的位置。这很重要,所以无论屏幕分辨率如何,我都知道用户想要移动的部分,并在视觉上显示在正确的位置。

我希望这可以帮助任何可能有同样问题的人。此外,如果任何人有更好的方法来完成同样的事情,请张贴它。

回答

2

有几件事。首先,开始阅读关于如何support multiple screens.密切关注汲取以及它们如何工作。

接下来,手表this video(至少第15-20分钟)。

本主题不是Cakewalk的掌握。我发现最好从我的代码中开始玩。我会建议创建一个表面视图,并开始讨论一些位图,不同的模拟器(屏幕大小和密度)以及不同类型的可绘制文件夹。

不幸的是,这个话题比我想Google承认的还要多,尽管它对于某些类型的应用程序来说绝对可行并不容易。

最后,你应该考虑熬煮你的问题更直截了当,如果你是不是在找一个抽象的回答(像这样)。

祝你好运!

+0

在18:20到视频开始,它显示了我在说什么,但它并没有回答这个问题。它显示了缩放比例如何保持整个图像大小相同,但位图中的单个元素不会位于相同的像素位置或可能会丢失。所以在这部影片中,说我需要知道是否有人触动了眼睛。我需要知道每个分辨率下眼睛的坐标。我怎么知道它将缩放到每个分辨率/密度的像素是什么?视频和我没有找到答案这个问题。也许答案是你不能。 – Mike 2010-11-11 04:46:58

相关问题