2015-09-06 46 views
0

我需要绘制像像素矩阵的东西。我创建了很多单元格(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); 
       } 
      } 
     } 
    } 

回答

0

为什么不创建一个500×500的位图,并且(UN)检查细胞时(重新)集像素呢?

声明字段类为位图,油漆和目标矩形:

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