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);
        }

その他のコード

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");
        }
    }

}
4

1 に答える 1

4

ここまたは他の質問では、理由について十分な情報を提供していませんcan't do that。既存のキャンバスではなく、新しいキャンバスに描画する理由はありません。

c新しい Canvasが何にも割り当てられていないため、コードが機能していません。myStringログの文字列を作成するようなものですが、使用することはありませんLog.d(tag, myString)

編集(すべてのコメントを読んだ後)

onCreate() で値を計算し、その値を onDraw() に表示したい場合は、それを行うだけです。結果をメンバー変数に格納すると、onDraw() でアクセスできます。

それ以外の場合: 完全なコードを提供してください。必要以上に複雑にしているだけだと思います...

編集2

あなたのコードは少し乱雑で、実行すべきではない領域で多くのことを実行しています。そのため、 の内部に描画することonProgressUpdate()は重大な誤りです。計算と描画をカプセル化する必要があります。

何をすべきか (View の代わりに SurfaceView を使用することをお勧めします...):

描画する文字列を更新する AsynchTask を開始する必要があります。文字列は、描画に使用するビュー内の変数である必要があります。描画自体は、描画スレッドによって呼び出される必要があります (親クラスとして View の代わりに SurfaceView を使用することを覚えています)。paintその onDraw() 内では、ペイントオブジェクト、指定されたキャンバス、および描画する文字列を使用する必要があります(パフォーマンス/メモリのために同じオブジェクトを何度も再作成しないように、変数もメンバー変数にすることを忘れないでください)理由)。

SurfaceView の操作方法がわからない場合、または描画スレッドの操作方法を知りたい場合は、2D 描画に関する私のチュートリアルをお読みください: www.droidnova.com/2d-tutorial-series

最後に短い文: あなたは多くのことを正しい方法で行いましたが、それを行う場所を間違えただけです。本当に達成したいことと、それを最も簡単な方法で達成する方法を再考する必要があります。多分私のチュートリアルはあなたの心を少しクリアするのに役立ちます.

于 2011-04-12T17:08:36.353 に答える