绘制Java Android背景(棋盘格)

3
我对Java和Android还比较陌生,但我正在寻找一份好的教程来帮助我入门。我想编写一个函数,以在应用程序的当前视图背景中绘制/重绘黑白棋盘格图案。我不想使用实际的图像,因为我想能够在重新调整大小等事件上重新绘制背景,并且我想动态更改正方形的大小。
感谢您的任何帮助。
5个回答

10

最有效的方法是使用一个包含棋盘格图案(例如2x2个正方形)的位图,并使用REPEAT平铺模式的位图着色器:

BitmapShader shader = new BitmapShader(bitmapTemplate, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
Paint paint = new Paint();
paint.setShader(shader);

// in your draw method

canvas.drawRect(x, y, width, height, paint);

只是一个包含您棋盘图案的位图。 - Romain Guy
@RomainGuy 我正在制作一个游戏,我想移动这样的平铺位图。所以xy是会变化的。看起来非常奇怪,背景不随矩形移动,它只是停留在原地。如何解决这个问题? - Adam Stelmaszczyk
您可以在BitmapShader上设置本地矩阵,也可以使用循环调用drawBitmap()自己绘制图块。 - Romain Guy
@RomainGuy 谢谢。或许您也知道这个问题的答案,请看一下:https://dev59.com/nWUp5IYBdhLWcg3wVWev - Adam Stelmaszczyk

5

我需要这个功能,并且希望它比提供自己的位图资源更加灵活。因此,这里有一个即时生成的选项。

在您的onCreate()或构造方法中调用此方法并保存画笔。然后在onDraw()中的填充操作中简单地使用该画笔。

private Paint createCheckerBoard(int pixelSize)
{
    Bitmap bitmap = Bitmap.createBitmap(pixelSize * 2, pixelSize * 2, Bitmap.Config.ARGB_8888);

    Paint fill = new Paint(Paint.ANTI_ALIAS_FLAG);
    fill.setStyle(Paint.Style.FILL);
    fill.setColor(0x22000000);

    Canvas canvas = new Canvas(bitmap);
    Rect rect = new Rect(0, 0, pixelSize, pixelSize);
    canvas.drawRect(rect, fill);
    rect.offset(pixelSize, pixelSize);
    canvas.drawRect(rect, fill);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setShader(new BitmapShader(bitmap, BitmapShader.TileMode.REPEAT, BitmapShader.TileMode.REPEAT));
    return paint;
}

4
我已经制作了一个自定义的Drawable,可以绘制背景棋盘格,详情请查看此github仓库 - CheckerboardDrawable
你可以这样使用它:
yourView.setBackgroundDrawable(CheckerboardDrawable.create());

并且它是可定制的:

CheckerboardDrawable drawable = new CheckerboardDrawable.Builder()
        .colorOdd(Color.LTGRAY)
        .colorEven(Color.DKGRAY)
        .size(20)
        .build();
yourView.setBackgroundDrawable(drawable);

输出结果将是:

截图

希望能对您有所帮助。

2

Kotlin,基于上面Simon的答案,

fun createCheckerBoard(tileSize: Int) = Paint(Paint.ANTI_ALIAS_FLAG).apply {
    shader = BitmapShader(Bitmap.createBitmap(tileSize * 2, tileSize * 2, Bitmap.Config.ARGB_8888).apply {
        Canvas(this).apply {
            val fill = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL; color = 0x22000000 }
            drawRect(0f, 0f, tileSize.toFloat(), tileSize.toFloat(), fill)
            drawRect(tileSize.toFloat(), tileSize.toFloat(), tileSize * 2f, tileSize * 2f, fill)
        }
    }, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)
}

-6

加载2张图片:黑色和白色

使用一个类创建包含可绘制和大小的2D数组棋盘[8][8]

创建一个2D循环

for (i < 8)
 for (j < 8)
  draw with canvas (chessboard[i][j].drawable) 

以下是你可以在谷歌上搜索的关键词: 2D 数组,使用画布进行绘图


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