2010-08-07 79 views
0

我對android開發非常陌生,一直試圖繪製由多個不同顏色的小矩形組成的正方形......本質上就像一個Mosaic。使用循環繪製多個形狀 - Android Canvas

現在基本上我正在從一個文件中讀取值,該文件將顏色分配給較小的Rects。我正在使用一對嵌套for循環來逐行繪製小Rects。然而,當程序結束時,只有一個小的Rect繪製,這是最後一個繪製的,它的顏色對應於從文件中讀取的第一個值。

下面是我的一些代碼,向你展示我的意思:

public SnapshotDraw(Context context) { 
    super(context); 

    for(int a = 0; a < 63; a++){ 
     for(int b = 0; b < 63; b++){ 
      fileName = PREFIX + "2" + EXTENSION; 

      try { 
       bf = new BufferedReader(new FileReader(fileName)); 
       tokens = new StringTokenizer(bf.readLine(), " \n"); 
       weight = Byte.parseByte(tokens.nextToken()); 

       x_scalar = b*MAG; 
       y_scalar = a*MAG; 

       mDrawable = new ShapeDrawable(new RectShape()); 
       mDrawable.getPaint().setColor(colour.getColour(weight)); 
       mDrawable.setBounds((X_OFFSET + x_scalar), (Y_OFFSET + y_scalar), ((MAG + X_OFFSET) + x_scalar), ((MAG + Y_OFFSET) + y_scalar)); 

      } catch (FileNotFoundException ex) { 
       Logger.getLogger(NetworkUtilities.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (IOException ex) { 
       Logger.getLogger(NetworkUtilities.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 
} 

protected void onDraw(Canvas canvas) { 
    mDrawable.draw(canvas); 
} 

這除了是延伸查看,被稱爲一個活動的onCreate()方法中的一類。

我會很感激任何指導,並提前致謝!

乾杯。

+0

好吧,所以我把令牌線放在外部for循環中,它返回一個正方形的最終位置,正確的顏色對應的是在數據文件中的位置......所以一個問題下來,一個仍然要去!爲什麼這段代碼只打印出1個Rect(最後一個Rect)而不是全部? – travega 2010-08-07 15:20:00

回答

0

好吧,我把它分類!這是我做的解決它:

public SnapshotDraw(Context context) { 
    super(context); 
    setFocusable(true); 

    mBitmap = Bitmap.createBitmap(475, 720, Bitmap.Config.ALPHA_8); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 

    Paint p = new Paint(); 
    float y = 10; 

    try { 
     fileName = PREFIX + "2" + EXTENSION; 
     bf = new BufferedReader(new FileReader(fileName)); 

     for(int a = 0; a < 63; a++){ 
      tokens = bf.readLine().split(" \n"); 
      for(int b = 0; b < 63; b++){ 

       weight = Byte.parseByte(tokens[b]); 

       x_scalar = b*MAG; 
       y_scalar = a*MAG; 

       p.setColor(new Colour().getColour(weight)); 
       canvas.drawRect((X_OFFSET + x_scalar), (Y_OFFSET + y_scalar), ((MAG + X_OFFSET) + x_scalar), ((MAG + Y_OFFSET) + y_scalar), p); 
      } 
     } 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(NetworkUtilities.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(NetworkUtilities.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    canvas.drawBitmap(mBitmap, 10, y, p); 
} 

和以前一樣,但改變了我繪製到位圖的方式。它看起來很美btw!

3

您正在循環內構建BufferedReader,因此bf.readLine()將始終返回相同的行。嘗試從循環中移出bftokens(注意不要使用StringTokenizer)。

+0

嗨泰迪爾, 感謝您的答覆,我從來不知道他們不鼓勵!這是爲什麼? 不幸的是我現在只是空指針異常...! – travega 2010-08-07 15:04:54

+1

@travega:「StringTokenizer是一個遺留類,由於兼容性的原因而被保留,儘管它在新代碼中的使用不受歡迎。」 http://download.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html – trashgod 2010-08-07 15:41:36

+0

我明白了!很高興知道!!感謝您的高舉。 – travega 2010-08-07 15:45:08