2013-03-19 90 views
0

在Android的Eclipse IDE中,我正在爲一個簡單的問題而戰。 我使用這樣的代碼:在循環中繪製到畫布

public class Reader extends Activity 
{ 
    // declarations 
    private class GraphView extends View 
    { 
     protected void onDraw(Canvas canvas) 
     { 
      synchronized(this) 
      { 
       final Paint paint = mPaint; 
       // some drawings 
       myvoid(canvas,paint); 
       // some drawings 
      } 
     } 
    } 
    void myvoid(Canvas c,Paint p) 
    { 
     int i=0; 
     do //or for cycle 
     { 
      i++; 
      c.drawText(Integer.toString(i),0,100,p); // <<<<<<<<<<<<<<<< Problem 
     } 
     while (i<100000); 
    } 
} 

畫布和文字沒有更新,直到while循環結束。 看來,在那段時間內畫布「鎖定」了。 我該如何實現,我可以在畫布上看到循環內部的進展情況?

謝謝,托馬斯。

+1

使用多線程它。 – Oyeme 2013-03-19 09:52:06

+0

你在主/ UI線程上執行這個循環嗎? – 2013-03-19 09:52:25

+0

你可以發佈你的視圖的完整代碼嗎 – Triode 2013-03-19 09:53:10

回答

0

我想你可以試試這個

imageView = (ImageView) this.findViewById(R.id.imageView1); 

     Display currentDisplay = getWindowManager().getDefaultDisplay(); 
     @SuppressWarnings("deprecation") 
     //float dw = currentDisplay.getWidth(); 
     // float dh = currentDisplay.getHeight(); 

     bitmap = Bitmap.createBitmap((int) dw, (int) dh, 
      Bitmap.Config.ARGB_8888); 
     canvas = new Canvas(bitmap); 
     paint = new Paint(); 
     paint.setColor(Color.RED); 
     imageView.setImageBitmap(bitmap); 

你可以試着讓你的畫布上的位圖圖像,然後設定位圖到您的ImageView

1

的問題是,你不給任何時候爲Android呈現繪製方法的結果。您應該繪製循環的一個步驟並調用invalidate來觸發下一步。 Android會在屏幕上繪製文本,然後再嘗試用增加的計數器重新繪製文本。請比較您的代碼和我的版本:

private class GraphView extends View { 

    protected void onDraw(Canvas canvas) { // some drawings 
     myvoid(canvas, paint); 
     // some drawings 
    } 

    void myvoid(Canvas c, Paint p) { 
     int i = 0; 
     do // or for cycle 
     { 
      i++; 
      c.drawText(Integer.toString(i), 0, 100, p); 
     } while (i < 100000); 
    } 
} 

我和無效的版本():

private class GraphView extends View { 
    int i = 0; 
    Paint paint = new Paint(); 

    @Override 
    public void draw(Canvas canvas) { 
     canvas.drawText(Integer.toString(i), 0, 100, paint); 
     i++; 
     invalidate(); 
     super.draw(canvas); 
    } 
} 
+0

i ++只是一個例子。我在do-while循環裏面有很多其他的東西。我知道,你的例子工作得很好。我想抽出時間,即使艱難環路也需要更長的時間。有沒有隱藏的提示,強制畫布每次重繪? – TomasNM 2013-03-19 11:12:23

+0

當然這是一個例子。每次你想在屏幕上顯示新的東西,你必須離開draw()方法。 Android會將你的draw()的結果傳遞到屏幕上。而且,如果draw()包含invalidate(),則Android將嘗試刷新以下動畫幀中的視圖。 – Zielony 2013-03-19 12:38:46

+0

好的,這很有道理。然而,即使我在draw()中運行循環,也會發生這種情況。 – TomasNM 2013-03-19 13:39:22