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要这样做。没有理由在新的画布上而不是已经存在的画布上绘图。

该代码不起作用,因为您的新 Canvasc没有分配给任何东西。就像为日志创建一个字符串myString但从不使用Log.d(tag, myString)

编辑(阅读所有评论后)

如果您在 onCreate() 中计算一个值并希望在 onDraw() 中显示该值,那么只需执行此操作即可。将结果存储在成员变量中,您可以在 onDraw() 中访问它。

否则:请提供您的完整代码。我猜你只是做的比它应该做的更复杂......

编辑2

你的代码有点乱,在你不应该做的地方做了很多事情。所以在里面画onProgressUpdate()是严重错误的。您应该封装您的计算和绘图。

你应该做什么(我建议使用 SurfaceView 而不是 View,无论如何......):

你应该启动你的 AsynchTask 来更新你想要绘制的字符串。该字符串应该是您视图中的一个变量,您可以在其中使用它进行绘图。绘图本身应该由绘图线程调用(我记得:使用 SurfaceView 而不是 View 作为父类)。在 onDraw() 中,您应该只使用您的绘画对象、给定的画布和您要绘制的字符串(不要忘记将paint变量设为成员变量,以防止为了性能/内存而一遍又一遍地重新创建相同的对象原因)。

如果您不知道如何使用 SurfaceView,或者如果您想了解如何使用绘图线程,请阅读我关于 2d 绘图的教程:www.droidnova.com/2d-tutorial-series

简短的最后一句话:您以正确的方式做了很多事情,只是与您做事的地方混为一谈。您应该尝试重新考虑您真正想要实现的目标以及如何以最简单的方式完成它。也许我的教程可以帮助您理清思路。

于 2011-04-12T17:08:36.353 回答