2015-09-06 72 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); 
}