Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android drawBitmap出现问题-源矩形和目标矩形_Android - Fatal编程技术网

Android drawBitmap出现问题-源矩形和目标矩形

Android drawBitmap出现问题-源矩形和目标矩形,android,Android,我有一个游戏,在其中一个关卡中,羊会被地雷炸掉。爆炸动画通过在512x515 png文件中包含4x4爆炸图像数组的png进行控制。。。见下文 然后,我使用以下代码设置爆炸动画: exp_bitmap_number_to_draw = (int)(time_since_death / 100); if (exp_bitmap_number_to_draw < 16) { explosi

我有一个游戏,在其中一个关卡中,羊会被地雷炸掉。爆炸动画通过在512x515 png文件中包含4x4爆炸图像数组的png进行控制。。。见下文

然后,我使用以下代码设置爆炸动画:

            exp_bitmap_number_to_draw = (int)(time_since_death / 100);

            if (exp_bitmap_number_to_draw < 16)
            {
                explosion_dst_rect.left = b2sx(sheep_x[i]) - sheep_radius * 5;
                explosion_dst_rect.right = b2sx(sheep_x[i]) + sheep_radius * 5;

                explosion_dst_rect.bottom = b2sy(sheep_y[i]) + sheep_radius * 5;
                explosion_dst_rect.top = b2sy(sheep_y[i]) - sheep_radius * 5;

                explosion_src_rect.left = 128 * (exp_bitmap_number_to_draw % 4);
                explosion_src_rect.top = 128 * (exp_bitmap_number_to_draw / 4);

                explosion_src_rect.right = explosion_src_rect.left + 128;
                explosion_src_rect.bottom = explosion_src_rect.top + 128;

                canvas.drawBitmap(explosion_bitmap, explosion_src_rect, explosion_dst_rect, null);
            }
exp\u bitmap\u number\u to\u draw=(int)(死亡后的时间/100);
if(exp\u位图\u编号\u至\u绘图<16)
{
爆炸方向左=b2sx(羊x[i])-羊半径*5;
爆炸右=b2sx(羊x[i])+羊半径*5;
爆炸垂直底部=b2sy(羊y[i])+羊半径*5;
爆炸半径=b2sy(绵羊y[i])-绵羊半径*5;
exp\u src\u rect.left=128*(exp\u位图\u编号\u到\u绘图%4);
exp\u src\u rect.top=128*(exp\u bitmap\u number\u to\u draw/4);
explosion_src_rect.right=explosion_src_rect.left+128;
explosion_src_rect.bottom=explosion_src_rect.top+128;
drawBitmap(爆炸位图、爆炸src rect、爆炸dst rect、null);
}
其中,explosion_src_rect是一个rect,explosion_dst_rect是一个RectF。b2sx()和b2sy()是将“运动场”上绵羊的绝对坐标转换为屏幕上的坐标的函数,只需添加一个偏移量即可

该代码在我试过的几款手机上都能完美运行,包括nexus S和Galaxy S II。但就在刚才,一位朋友在三星galaxy tab 8.9上尝试了该代码,发现爆炸似乎是goofey。他给我发了一份屏幕截图:


知道是什么导致了这种情况吗?

如果资源密度不正确,系统将加载默认资源,并根据需要将其放大或缩小,以匹配当前屏幕的密度。 在某些情况下,您可能不希望Android预先扩展资源。避免预缩放的最简单方法是使用
nodpi
配置限定符将资源放在资源目录中。例如:
res/drawable nodpi/icon.png
。因此,您必须将位图放入
`res/drawable nodpi/
文件夹中。
查看:

如果资源密度不正确,系统将加载默认资源,并根据需要将其放大或缩小,以匹配当前屏幕的密度。 在某些情况下,您可能不希望Android预先扩展资源。避免预缩放的最简单方法是使用
nodpi
配置限定符将资源放在资源目录中。例如:
res/drawable nodpi/icon.png
。因此,您必须将位图放入
`res/drawable nodpi/
文件夹中。
请看一看:

目标矩形的宽度,而不是如您所说的爆炸帧的大小,被设置为画布的宽度/4。手机通常尺寸相似,但较大的平板电脑屏幕尺寸要大得多——正如文档中所述:

绘制指定的位图,自动缩放/转换以填充目标矩形[…] 此函数忽略与位图关联的密度。这是因为源和目标矩形坐标空间在各自的密度中,因此必须已经应用了适当的比例因子

因此,未缩放到画布大小的位图从src Rect开始绘制,但扩展到src的边界之外,因为它被告知填充DST,忽略两个位置的密度

至于解决方案,我不确定,确切地说-最好是在您的
/res
中有各种尺寸的图像。根据加载位图的方式,您可能能够使位图按比例缩放,但是在位图上的固定宽度转换必须变得更加动态


希望这能有所帮助:)

目标矩形的宽度,而不是如您所说的爆炸帧的大小,被设置为画布的宽度/4。手机通常尺寸相似,但较大的平板电脑屏幕尺寸要大得多——正如文档中所述:

绘制指定的位图,自动缩放/转换以填充目标矩形[…] 此函数忽略与位图关联的密度。这是因为源和目标矩形坐标空间在各自的密度中,因此必须已经应用了适当的比例因子

因此,未缩放到画布大小的位图从src Rect开始绘制,但扩展到src的边界之外,因为它被告知填充DST,忽略两个位置的密度

至于解决方案,我不确定,确切地说-最好是在您的
/res
中有各种尺寸的图像。根据加载位图的方式,您可能能够使位图按比例缩放,但是在位图上的固定宽度转换必须变得更加动态


希望这能有所帮助:)

我也遇到了同样的问题,我的答案是像这样加载位图,而不是按常规方式加载:


getResources().openRawResource(imageId)

我遇到了与这里所问相同的问题,我的答案是像这样加载位图,而不是按常规方式加载:


getResources().openRawResource(imageId)

您是否在大屏幕上使用不同的位图?另外,sheep_半径是如何定义的?只有一组位图。它们适用于所有屏幕尺寸。float sheep_radius是画布宽度除以40。如果所有屏幕仅使用一组位图,则应将其放入res/drawable nodp中