绘图 - 优化
Drawing - optimization
我需要绘制像素矩阵之类的东西。我创建了很多单元格 (500x500) 并填充它们 (= cellchecked)。但是当我有超过 300 个已填充的单元格时,我会遇到滞后问题。这个问题在 onDraw 方法内部。每次它都必须重新检查单元格。如何优化这段代码?
onTouchEvent:
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
column = (short) (event.getX() / cellWidth);
row = (short) (event.getY() / cellHeight);
plot(column, row);
cellChecked[column][row] = true;
pX = (short) (event.getX() / cellWidth);
pY = (short) (event.getY() / cellHeight);
break;
case MotionEvent.ACTION_MOVE:
column = (short) (event.getX() / cellWidth);
row = (short) (event.getY() / cellHeight);
cellChecked[column][row] = true;
pX = (short) (event.getX() / cellWidth);
pY = (short) (event.getY() / cellHeight);
counterxy++;
mInterface.onActionFinished(pX, pY, counterxy); // Wyslanie wspolrzednych do MainActivity
break;
case MotionEvent.ACTION_UP:
invalidate();
return true;
}
invalidate();
return true;
}
onDraw:
protected void onDraw(Canvas canvas) {
this.canvas = canvas;
canvas.drawColor(Color.WHITE);
if (numColumns == 0 || numRows == 0)
return;
for (int i = 0; i < numColumns; i++)
{
for (int j = 0; j < numRows; j++)
{
if (cellChecked[i][j])
{
canvas.drawRect(i * cellWidth, j * cellHeight, (i + 1) * cellWidth, (j + 1) * cellHeight, blackPaint);
}
}
}
}
为什么不创建 500x500 位图并在(未)选中单元格时(重新)设置像素?
在 class 中为位图、绘画和目标矩形声明字段:
Bitmap bmp = Bitmap.createBitmap(500, 500, Bitmap.Config.RGB_565);
Paint paint = new Paint();
Rect dst = new Rect();
使用
设置像素
setPixel(pX, pY, Color.BLACK); // Use Color.WHITE to reset
在构造函数中,禁用绘制对象的抗锯齿以确保位图不会变得模糊。同时将位图清除为所需的颜色:
paint.setAntiAlias(false);
paint.setFilterBitmap(false);
bmp.clear(Color.WHITE);
在onDraw中绘制位图
protected void onDraw(Canvas canvas) {
dst.right = 500 * cellWidth;
dst.bottom = 500 * cellHeight;
canvas.drawBitmap(bmp, null, dst, paint);
}
我需要绘制像素矩阵之类的东西。我创建了很多单元格 (500x500) 并填充它们 (= cellchecked)。但是当我有超过 300 个已填充的单元格时,我会遇到滞后问题。这个问题在 onDraw 方法内部。每次它都必须重新检查单元格。如何优化这段代码?
onTouchEvent:
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
column = (short) (event.getX() / cellWidth);
row = (short) (event.getY() / cellHeight);
plot(column, row);
cellChecked[column][row] = true;
pX = (short) (event.getX() / cellWidth);
pY = (short) (event.getY() / cellHeight);
break;
case MotionEvent.ACTION_MOVE:
column = (short) (event.getX() / cellWidth);
row = (short) (event.getY() / cellHeight);
cellChecked[column][row] = true;
pX = (short) (event.getX() / cellWidth);
pY = (short) (event.getY() / cellHeight);
counterxy++;
mInterface.onActionFinished(pX, pY, counterxy); // Wyslanie wspolrzednych do MainActivity
break;
case MotionEvent.ACTION_UP:
invalidate();
return true;
}
invalidate();
return true;
}
onDraw:
protected void onDraw(Canvas canvas) {
this.canvas = canvas;
canvas.drawColor(Color.WHITE);
if (numColumns == 0 || numRows == 0)
return;
for (int i = 0; i < numColumns; i++)
{
for (int j = 0; j < numRows; j++)
{
if (cellChecked[i][j])
{
canvas.drawRect(i * cellWidth, j * cellHeight, (i + 1) * cellWidth, (j + 1) * cellHeight, blackPaint);
}
}
}
}
为什么不创建 500x500 位图并在(未)选中单元格时(重新)设置像素?
在 class 中为位图、绘画和目标矩形声明字段:
Bitmap bmp = Bitmap.createBitmap(500, 500, Bitmap.Config.RGB_565);
Paint paint = new Paint();
Rect dst = new Rect();
使用
设置像素setPixel(pX, pY, Color.BLACK); // Use Color.WHITE to reset
在构造函数中,禁用绘制对象的抗锯齿以确保位图不会变得模糊。同时将位图清除为所需的颜色:
paint.setAntiAlias(false);
paint.setFilterBitmap(false);
bmp.clear(Color.WHITE);
在onDraw中绘制位图
protected void onDraw(Canvas canvas) {
dst.right = 500 * cellWidth;
dst.bottom = 500 * cellHeight;
canvas.drawBitmap(bmp, null, dst, paint);
}