-1

十萬我試圖使http://arapaho.nsuok.edu/~deckar01/Zvis.html使用畫布繪製Rects

一個原生的Android版本,所以,我做了一個自定義的視圖,吸引所需的所有方塊。當然,一旦數字變得足夠大,Canvas開始繪製上千個方塊,這個繪圖就會花上10秒。

有沒有更好的方法來做到這一點?似乎有一些顯而易見的東西我沒有想到做/使用。

視圖的onDraw方法如下,以防有所幫助。有任何想法嗎?

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    final int number = mNumber; 
    final float tileWidth, tileHeight; 

    /*mTileWidth = mWW/(number - 1); 
    mTileHeight = mHH/(number - 1);*/ 

    // make them squares 
    if (mWW <= mHH) { 
     tileWidth = tileHeight = mWW/(number - 1); 
    } else { 
     tileWidth = tileHeight = mHH/(number - 1); 
    } 

    mWhiteTextPaint.setTextSize(48f/72 * tileWidth); 
    mBlackTextPaint.setTextSize(48f/72 * tileWidth); 

    float currX = getPaddingLeft(); 
    float currY = getPaddingTop(); 

    for (int i = 1; i <= number - 1; i++) { 
     mBackgroundPaint.setColor(getBackgroundColor(i, number)); 
     canvas.drawRect(currX, currY, currX + tileWidth, 
       currY + tileHeight, 
       mBackgroundPaint); 
     final String text = String.valueOf(i); 
     canvas.drawText(text, 
       currX + tileWidth/2 - mWhiteTextPaint.measureText(text)/2, 
       currY + tileHeight * 0.9f, mWhiteTextPaint); 
     currX += tileWidth; 
    } 
    currX = getPaddingLeft(); 
    currY += tileHeight; 

    for (int i = 2; i <= number - 1; i++) { 
     for (int j = 1; j <= number - 1; j++) { 
      final int num = (j == 1) ? i : (i * j) % number; 

      mBackgroundPaint.setColor(getBackgroundColor(num, number)); 
      canvas.drawRect(currX, currY, currX + tileWidth, 
        currY + tileHeight, 
        mBackgroundPaint); 
      final String text = String.valueOf(num); 
      if (num == 0) { 
       canvas.drawText(text, 
         currX + tileWidth/2 - mBlackTextPaint.measureText(text)/2, 
         currY + tileHeight * 0.9f, mBlackTextPaint); 
      } else { 
       canvas.drawText(text, 
         currX + tileWidth/2 - mWhiteTextPaint.measureText(text)/2, 
         currY + tileHeight * 0.9f, mWhiteTextPaint); 
      } 
      currX += tileWidth; 
     } 
     currX = getPaddingLeft(); 
     currY += tileHeight; 
    } 

    if (mOnDrawFinishedListener != null) { 
     mOnDrawFinishedListener.onDrawFinished(number); 
    } 
} 
+0

http://developer.android.com/training/custom-views/optimizing-view.html#accelerate – CarCzar 2014-09-05 18:36:12

+0

@CarCzar我試着把setLayerType(View.LAYER_TYPE_HARDWARE,null);在我的視圖的構造函數中;它並沒有明顯的幫助。 – 2014-09-05 18:37:10

+0

您應該在另一個線程中運行您的繪圖代碼。我知道有一些方法可以實現這一目標,但不知道當前的名稱。通過API搜索,我相信你會找到它。 – CarCzar 2014-09-05 18:42:12

回答

2

正如@CarCzar已經說了,你可以畫在一個單獨的線程都成位圖,然後在UI線程你只在屏幕上繪製該位圖。或者,您可以使用OpenGL。這通常用於更有活力的事情,比如遊戲。事情是OpenGL運行在一個單獨的圖形線程,因此不會阻止你的用戶界面。