2011-04-12 32 views
1
  @Override 
      protected void onDraw(Canvas canvas) 
      { 
      //Note:I do not want to use the canvas object from this function param 
      //If i do so its working , But i would like to understand why the following is not working 

     Canvas c =new Canvas(); 
      Paint paint = new Paint(); 
      paint.setStyle(Paint.Style.FILL); 
      paint.setAntiAlias(true); 
      paint.setColor(Color.WHITE); 
      c.drawText("HELLO CANVAS",200,300,paint); 
     } 

更多的代碼安卓:寫作使用的drawText()文本不可見

public class graphicProj extends Activity { 

    private Canvas canvas; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    { 
     .... 

     SimpleView simpleview_obj = new SimpleView(this); 
     setContentView(simpleview_obj); 
     simpleview_obj.onDraw(canvas); 
     ..... 

    new GetData().execute(); 

    } 
    private static class SimpleView extends View { 
     private ShapeDrawable mDrawable = new ShapeDrawable(); 
....  
    protected void onDraw(Canvas canvas) { 

    //draw graphic objects 
    .... 
     } 
    } 

    public class GetData extends AsyncTask<Void, String, Void> { 

     @Override 
     protected void onPreExecute() { 
      Log.d("PROJ","STARTIN"); 
     } 

     @Override 
     protected Void doInBackground(Void... unused) { 
     ////My calculation and reading frm DataStream 

     } 

     @Override 
     protected void onProgressUpdate(String... data) { 

      //I Keep updating the result... 
      Paint paint = new Paint(); 
      paint.setStyle(Paint.Style.FILL); 
      paint.setAntiAlias(true); 
      paint.setColor(Color.WHITE); 
      canvas.drawText(result, 200, 300, paint); 


     } 

     @Override 
     protected void onPostExecute(Void unused) { 
      Log.d("PROJ","END"); 
     } 
    } 

} 
+0

你怎麼知道它不工作? – rajath 2011-04-12 12:58:07

+0

如果我將最後一行更改爲canvas.drawText(「HELLO CANVAS」,200,300,paint);有用。但我想知道爲什麼上述一個不工作。沒有在這個意義上工作,它不會在屏幕上打印任何字符! – m4n07 2011-04-12 12:59:19

+1

因爲屏幕使用'canvas',而不是'c' ......這就是爲什麼系統爲您提供特定的畫布以供繪製。 – rajath 2011-04-12 13:01:48

回答

4

不是在這裏或在您的其他問題有你提供爲什麼can't do that足夠的信息。沒有理由使用新的畫布而不是現有的畫布。

該代碼不起作用,因爲您的新Canvas c未分配給任何內容。它像創建一個字符串myString的日誌,但從來沒有使用Log.d(tag, myString)

編輯

(閱讀完所有的意見後)如果你在你的onCreate()計算價值,要顯示在您的onDraw該值(),只是這樣做。將結果存儲在一個成員變量中,您可以在onDraw()中訪問它。

否則:請提供您的完整代碼。我猜你只是做它的方式複雜得多,它應該是...

EDIT2

你的代碼是有點亂,做了很多的東西,在你不應該做它的區域。所以在onProgressUpdate()內畫圖是嚴重錯誤的。你應該封裝你的計算和繪圖。

你應該做的(我推薦使用SurfaceView,而不是查看,反正...):

你應該開始你的AsynchTask哪些更新要繪製的字符串。該字符串應該是您的視圖中的一個變量,您可以在其中使用它進行繪製。 繪圖本身應該由繪圖線程調用(我記得:使用SurfaceView而不是View作爲父類)。在那個onDraw()裏面,你應該只使用你的繪畫對象,給定的畫布和你想繪製的字符串(不要忘記讓paint變量也是一個成員變量,以防止重複再現相同的對象以獲得性能/記憶的原因)。

如果你不知道如何使用SurfaceView工作,或者,如果你想了解你可以如何與引出線工作,請閱讀我關於2D繪圖教程:www.droidnova.com/2d-tutorial-series

最後一句話:你用正確的方式做了很多事情,你只是混淆了你做的地方。你應該嘗試重新思考你真正想要達到的目標以及如何以最簡單的方式完成任務。也許我的教程有助於澄清你的想法。

+0

更新了代碼!首先我調用onDraw()在屏幕上繪製圖形對象。之後,我嘗試連續進行計算(因此Async活動)並繼續顯示結果。 – m4n07 2011-04-12 17:35:09

+0

@ m4n07編輯我的答案 – WarrenFaith 2011-04-12 19:38:13

+0

感謝您的指點,我會盡量學習surfaceview。 – m4n07 2011-04-13 05:04:54