2012-10-02 76 views
1

這是我第一次在這裏提出問題,所以我會盡量保持主題。我試圖通過創建一個適當大小的Bitmap對象的ArrayList並按順序繪製它們來隨機生成背景。順便說一下,該實現可以很好地加載單個位圖;它只是在列表中磕磕絆絆。Android:在黑色背景中繪製Bitmaps數組結果列表

在我開始使用代碼之前,我想指出理想情況下,我會通過添加單個像素或圖塊來製作單個位圖,並且實際上已經嘗試了一些變體,但它們都會導致黑色屏幕;我開始認爲這可能是我如何繪製到畫布上的問題。無論如何,這是我有什麼:

首先,我生成隨機ArrayList,目前只使用3種顏色。我會讓它返回列表,但它只是引用線程變量中的一個私有方法,所以它並不重要。

private void genMap(Resources res) 
    { 
     // Load basic tiles. 
     Bitmap green = BitmapFactory.decodeResource(res, R.drawable.green); 
     Bitmap red = BitmapFactory.decodeResource(res, R.drawable.red); 
     Bitmap blue = BitmapFactory.decodeResource(res, R.drawable.blue); 

        // All tiles must be the same size. 
     int tile_width = green.getWidth(); 
     int tile_height = green.getHeight(); 
     int num_x = mCanvasWidth/tile_width; 
     int num_y = mCanvasHeight/tile_height; 

     for (int j = 0; j < num_y; j++) 
     { 
      for (int i = 0; i < num_x; i++) 
      { 
       double r = Math.random(); 
       Bitmap tile; 
       if (r <= 1/3) {tile = green;} 
       else if (r <= 2/3) {tile = red;} 
       else {tile = blue;} 
       // Create a new Bitmap in order to avoid referencing the old value. 
       mBackgroundImages.add(Bitmap.createBitmap(tile)); 
      } 
     } 
    } 

所以,這就是隨機值如何映射到模式。該方法在線程的構造函數中調用,每次調用onCreate時都會調用該方法;現在,我只是清除列表並每次製作一個新的隨機模式:

... 
Resources res = context.getResources(); 
mBackgroundImages = new ArrayList<Bitmap>(); 
genMap(res); 
... 

最後,繪製方法;它工作正常加載通過BitmapFactory.decodeResources一個位圖,但顯示這樣做的時候黑屏:

private void doDraw(Canvas canvas) 
    { 
     /* Draw the bg. 
     * Remember, Canvas objects accumulate. 
     * So drawn first = most in the background. */ 
     if (canvas != null) 
     { 
      if (mBackgroundImages.size() > 0) 
      { 
       int tile_width = mBackgroundImages.get(0).getWidth(); 
       int tile_height = mBackgroundImages.get(0).getHeight(); 
       for (int y = 0; y < mCanvasHeight/tile_height; y++) 
       { 
        for(int x = 0; x < mCanvasWidth/tile_width; x++) 
        { 
         // Draw the Bitmap at the correct position in the list; Y * XWIDTH + X, at pos X * XWIDTH, Y * YWIDTH. 
         canvas.drawBitmap(mBackgroundImages.get((x + y * (mCanvasWidth/tile_width))), x * tile_width, y * tile_height, null); 
        } 
       } 
      } 
     } 
    } 

任何幫助,將不勝感激,謝謝。

+0

絕對是一個平鋪的算法。我認爲這個問題必須處理這些圖像,因爲如果出現拼貼問題,通常圖像繪圖會有奇怪的偏移。 –

回答

0

您是否仔細檢查了以下行的優先順序?

((x + y * (mCanvasWidth/tile_width))) 

雖然有意思的問題是:你是否畫純色?我也想看看這實際上是讓一個位圖:

mBackgroundImages.add(Bitmap.createBitmap(tile)); 

你可能實際上是能夠只是保持,而不是創建大量位圖的參考,但可以稍後