2010-08-07 55 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