【发布时间】:2013-01-05 06:10:11
【问题描述】:
我最近一直在尝试使用与臭名昭著的 LunarLander 类似的方法来实现我的第一个 Android 游戏。我在没有游戏引擎的帮助下自己渲染图形,这似乎是迄今为止最复杂的部分。
问题
我正在确定屏幕的宽度,并将该信息转发到一个算法中,该算法确定在给定宽度和一些其他边距值的情况下可以水平呈现的图像的最大数量(参见下面的calculateMaxBeadsInWidth())。但是,数学似乎与算法计算的值不匹配。基本上,它是确定只能显示X 数量的图像,而实际上X + 2 图像可以很容易地显示在屏幕上。
计算
我解析了很多调试输出,显示屏幕的实际宽度为800 pixels,图像宽度为44 pixels。因此,假设边距为100 pixels(最左侧为50 pixels,最右侧为50 pixels),则剩下700 pixels 可以使用。现在,floor(700 / 44) = 15,所以只显示了 15 张图片。但显然还有更多空间(见图片)!
代码
我的算法:
private int calculateMaxBeadsInWidth() {
float eff_width = screenWidth - (BOARD_MARGIN_HORIZONTAL * 2);
return (int) (eff_width / bead_width);
}
注意BOARD_MARGIN_HORIZONTAL 的值为50.0f。
一些图片
这是我的算法产生的结果:
但是,正如您所看到的,很明显,您可以轻松在线条的末端(右侧)再安装至少 2 个珠子。例如,这张图显示了当我将一行中的珠子数量硬编码为比算法产生的多两个时会发生什么:
这是带有用红线详细说明的边距的图像。如您所见,仍有足够的空间:
补充信息
我正在 Google Nexus 7 上测试此应用程序。
我正在使用getResources().getDisplayMetrics().widthPixels; 来获取屏幕的宽度。也许问题就在这里?
我的问题
是否有一些我没有考虑的分辨率值会影响结果?为什么计算得这么不准确?
如果您需要更多信息,我很乐意提供,我们将不胜感激!
【问题讨论】:
-
当我忘记考虑像素密度时遇到了类似的问题。不确定这是否与您正在做的事情有关,但可能值得研究。
-
是的,这就是我正在考虑的。像素密度和分辨率异常可能会导致空间损失。除非我非常确定情况确实如此,否则我会担心采用这条路线,但是,因为独立于像素密度渲染图形所涉及的复杂性。
-
Check out these answers 获取一些快速转换方法。
-
非常有趣的帖子 - 已添加书签!我尝试实现这些方法,但是很可惜,它们只是使我的图像显着膨胀或缩小。我认为这是一个很好的途径,我将继续测试,直到找到解决方案!
标签: android android-layout surfaceview