【发布时间】:2011-10-26 14:50:44
【问题描述】:
我对 java 和 android 还很陌生,但我正在寻找一个能走上正轨的好教程。我想编写一个函数,在我的应用程序当前视图的背景上绘制/重绘黑白棋盘图案。我不想使用实际图像,因为我希望能够在调整大小事件等时重绘背景。我想动态改变正方形的大小..
感谢您的帮助
【问题讨论】:
标签: java android colors background
我对 java 和 android 还很陌生,但我正在寻找一个能走上正轨的好教程。我想编写一个函数,在我的应用程序当前视图的背景上绘制/重绘黑白棋盘图案。我不想使用实际图像,因为我希望能够在调整大小事件等时重绘背景。我想动态改变正方形的大小..
感谢您的帮助
【问题讨论】:
标签: java android colors background
最有效的方法是使用包含棋盘图案(例如 2x2 正方形)的位图,并使用带有 REPEAT 平铺模式的 BitmapShader:
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);
【讨论】:
x 和y 正在改变。它看起来很奇怪,背景没有随着矩形移动,它只是停留。如何解决这个问题?
我需要这个并且需要它比提供我自己的位图资源更灵活一点。所以这是一个即时选项。
在您的 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;
}
【讨论】:
我已经制作了一个自定义的Drawable,它可以绘制背景棋盘格,请参阅这个 github repo - CheckerboardDrawable。
你可以这样使用它:
yourView.setBackgroundDrawable(CheckerboardDrawable.create());
而且它是可定制的:
CheckerboardDrawable drawable = new CheckerboardDrawable.Builder()
.colorOdd(Color.LTGRAY)
.colorEven(Color.DKGRAY)
.size(20)
.build();
yourView.setBackgroundDrawable(drawable);
输出将是:
希望对你有帮助。
【讨论】:
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)
}
【讨论】:
加载 2 张图片:黑白
从一个包含可绘制对象和大小的类中创建一个二维数组 chessboard[8][8]
创建一个二维循环
for (i < 8)
for (j < 8)
draw with canvas (chessboard[i][j].drawable)
您可以使用 Google 搜索的关键字: 二维数组,用画布绘制
【讨论】: