如何在Android上绘制完整的800 x 480图像

时间:2010-12-23 10:04:16

标签: android screen-resolution

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

我正在使用这样的代码:

canvas.drawBitmap(screen [1],new Rect(0,0,800,300),new Rect(0,0,800,300),null);

出于某种原因

width_x = canvas.getWidth();

width_y = canvas.getHeight();

将我的分辨率报告为533乘320.现在我假设这是用于 expletive-deleted 迷人的缩放系统android使用所以应用程序在所有手机上显示相同的大小,但我想忽略这一点。我正在写一个游戏,所以想要自己处理缩放和定位 - 比如使用更多的屏幕空间,如果它可用。最好的Android练习可能适合基于图标的应用程序,但我想绘制到绝对像素位置,并获得屏幕的绝对分辨率信息。

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

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

为了缩放它,我使用了像

这样的东西

canvas.drawBitmap(screen [1],new Rect(0,0,800,300),new Rect((int)(0.0f),(int)(0.0f),(int)(533.0f),(int) (187.5f)),null); //数字刚刚进行测试 - 相当于报告的屏幕分辨率。看起来很可怕

非常感谢任何帮助。

干杯,

罗宾。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

如果您想知道您正在使用的屏幕空间量(如果您正在进行任何自定义绘图,那么您肯定应该这样做),您将要覆盖onSizeChanged()或{{ 3}},取决于实施。

你应该真正查看surfaceChanged(),有一些很好的例子,说明如何做到你想要做的事情。

祝你好运!

答案 1 :(得分:0)

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

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

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

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

干杯,

罗宾。