1

我有一个 800 x 300 的图像,我知道这是我的测试平台分辨率的宽度(HTC Desire at 800x480)。当我尝试将此图像绘制到屏幕上时,它会奇怪地缩放。它溢出屏幕的左侧,几乎填满了整个垂直方向。

我正在使用这样的代码:

canvas.drawBitmap(屏幕[1],新矩形(0,0,800,300),新矩形(0,0,800,300),空);

由于某些原因

width_x = canvas.getWidth();

width_y = canvas.getHeight();

报告我的分辨率为 533 x 320。现在我假设这是针对android 使用的已删除的迷人缩放系统,因此应用程序在所有手机上的大小都相同,但我想忽略这一点。我正在编写一个游戏,所以想自己处理缩放和定位 - 例如,如果可用的话,使用更多的屏幕空间。最佳 android 实践可能适用于基于图标的应用程序,但我想绘制到绝对像素位置,并获取屏幕的绝对分辨率信息。

因此我的问题是——这绝对不可能吗?如果它是完全禁忌的,因为 android 有一个简单而有效的系统来执行此操作,那么我很想知道它是什么。dpi 与我的游戏设计无关(就像这是一个 pc 游戏一样,这将是无关紧要的)

也许我的屏幕实际上是 533 x 320,除非我以某种方式指定分辨率?我尝试使用宽度和高度的缩放值,并且图像在屏幕上的大小大致正确,但由于发生了某种缩放,边缘呈锯齿状。因此,我无法访问我的屏幕能够显示的所有像素。

为了缩放它,我使用了类似的东西

canvas.drawBitmap(屏幕[1],新矩形(0,0,800,300),新矩形((int)(0.0f),(int)(0.0f),(int)(533.0f),(int)(187.5f )), 无效的); // 刚刚输入用于测试的数字 - 比率相当于报告的屏幕分辨率。看起来很可怕

任何帮助将不胜感激。

干杯,

罗宾。

4

2 回答 2

0

Android 没有做任何事情来扰乱您感知的分辨率 - 您正在使用 800x480 像素来处理该 Desire。

您是否在全屏、自定义视图和覆盖 onDraw 中工作?你在使用 SurfaceView 吗?在帮助您解决问题之前,我们需要了解这些事情。

假设您正在执行上述操作,您应该能够使用Canvas.drawBitmap(Bitmap bitmap, float left, float top, Paint paint)将位图绘制到屏幕上而无需任何缩放。在你的情况下,这看起来像是canvas.drawBitmap( screen[1], 0.0f, 0.0f, null);把它放在画布的左上角。

在性能敏感的应用程序(如游戏)中,您不希望在绘制循环期间使用源/目标 Rect 版本的 drawBitmap(),因为它会在循环的每次迭代期间进行缩放。相反,将原始位图的缩放/裁剪版本绘制到另一个成员位图,并使用上面链接的 drawBitmap 的 x/y 偏移版本在循环中绘制那个。

如果你想知道你正在使用的屏幕空间的数量(如果你正在做任何自定义绘图,你肯定应该),你会想要覆盖onSizeChanged()surfaceChanged(),具体取决于实现.

您真的应该查看API 演示,有一些很好的示例说明如何在其中完成您想要做的事情。

祝你好运!

于 2010-12-23T16:00:54.653 回答
0

感谢您的答复。我修复了我的一个问题——在清单文件中,我所针对的操作系统设置不正确——将其切换为 4(即 1.6)似乎修复了我获得的高度和宽度值,至少对于 HTC 而言。模拟器问题更大,但至少它是朝着正确方向迈出的重要一步。为了您的信息,我正在全屏、横向模式(固定)下工作,几乎所有东西都具有覆盖功能。(包括onDraw、surfaceChanged等)

如果我能获得绝对宽度和高度,我可以编写自己的代码来加载正确的资产并使用正确的缩放比例进行屏幕定位 - dpi 不是问题,因此希望不会偏离建议的准则太远。

还要感谢有关绘制位图以提高速度的提示 - 这是非常方便的信息。你碰巧知道这个命令吗?我没有注意到 canvas.drawBitmap 具有将数据发送到另一个位图的重载。

非常感谢您的帮助,当然,圣诞节快乐!(或您个人选择的宗教/世俗假期)

干杯,

罗宾。

于 2010-12-24T10:31:29.133 回答