安卓 - 在画布中绘制位图

7

我目前有一个迷宫游戏,它绘制了一个5x5的正方形(占据屏幕宽度并平均分割)。然后,对于这些盒子中的每一个,使用x和y坐标,我使用drawRect来绘制有颜色的背景。

我现在遇到的问题是,我需要在同一位置绘制一张图片,因此替换当前的纯色背景填充。

以下是我目前使用的drawRect代码(几个示例):

// these are all the variation of drawRect that I use
canvas.drawRect(x, y, (x + totalCellWidth), (y + totalCellHeight), green);
canvas.drawRect(x + 1, y, (x + totalCellWidth), (y + totalCellHeight), green);
canvas.drawRect(x, y + 1, (x + totalCellWidth), (y + totalCellHeight), green);

接下来,我还需要在画布中为所有其他正方形实现一个背景图像。这个背景将在其上方绘制简单的1像素黑线,当前代码是在灰色背景上绘制。

background = new Paint();
background.setColor(bgColor);
canvas.drawRect(0, 0, width, height, background);

请问是否有可能实现这一点?如果可以,我应该如何做到在尽量减少内存使用的同时只使用1个图像并使其扩大和缩小以填充相关方形空间(这在所有不同的屏幕尺寸上都会有所不同,因为它将整个屏幕宽度均分)。

2个回答

10
使用Canvas方法public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)。将dst设置为您想要整个图像缩放到的矩形的大小。 编辑: 这是在画布上以正方形绘制位图的可能实现。假设位图在二维数组中(例如,Bitmap bitmapArray[][];),并且画布是正方形的,因此正方形位图的宽高比不会失真。
private static final int NUMBER_OF_VERTICAL_SQUARES = 5;
private static final int NUMBER_OF_HORIZONTAL_SQUARES = 5;

...

    int canvasWidth = canvas.getWidth();
    int canvasHeight = canvas.getHeight();

    int squareWidth = canvasWidth / NUMBER_OF_HORIZONTAL_SQUARES;
    int squareHeight = canvasHeight / NUMBER_OF_VERTICAL_SQUARES;
    Rect destinationRect = new Rect();

    int xOffset;
    int yOffset;

    // Set the destination rectangle size
    destinationRect.set(0, 0, squareWidth, squareHeight);

    for (int horizontalPosition = 0; horizontalPosition < NUMBER_OF_HORIZONTAL_SQUARES; horizontalPosition++){

        xOffset = horizontalPosition * squareWidth;

        for (int verticalPosition = 0; verticalPosition < NUMBER_OF_VERTICAL_SQUARES; verticalPosition++){

            yOffset = verticalPosition * squareHeight;

            // Set the destination rectangle offset for the canvas origin
            destinationRect.offsetTo(xOffset, yOffset);

            // Draw the bitmap into the destination rectangle on the canvas
            canvas.drawBitmap(bitmapArray[horizontalPosition][verticalPosition], null, destinationRect, null);
        }
    }

请您提供一个带有代码的示例,主要是关于如何指定要定位的矩形,同时参考我当前绘制矩形的方式。谢谢。 - SingleWave Games
编辑了答案以显示目标矩形的创建和迭代通过5x5个正方形的集合。 - bobnoble
我对Android和Java开发非常陌生,因此想知道如何将位图添加到2D数组中。我目前正在使用“BitmapFactory”获取位图图像。另外需要提及的一点是,我的位图始终都是相同的,因此我能否硬编码任何内容(这样可以节省内存)?谢谢。 - SingleWave Games
@LandLPartners - 当您说“位图总是相同”时,是指5x5矩阵中每个正方形都包含相同的位图吗?还是单个位图的一部分将填充每个正方形?还是其他什么意思? - bobnoble
我现在已经通过使用你的示例代码片段解决了这个问题。就位图而言,有两种情况,一种是每个方格都有多个相同的图像。另一种情况(主背景)是一个位图被拉伸到整个5x5网格。感谢你的帮助。 - SingleWave Games

2

请尝试以下代码:

Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);

canvas.drawBitmap(bitmap, x, y, paint);

你也可以参考这个答案

==================

如果您需要,您还可以参考此答案。


这段代码可以很好地绘制图像,但是它只绘制了图像的一部分,因为只设置了x和y的起始点。我还需要定义结束的x和y点,类似于使用drawRect时所做的操作。谢谢。 - SingleWave Games
不好意思,可能我表达不够清楚。我目前正在使用drawRect,但是需要在这个位置绘制一个位图。然而,这个位图的宽度和高度会根据用户在地图上的位置不断变化。 - SingleWave Games

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接