绘图 - 优化

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);
}