【问题标题】:Android: Text not visible on writing using drawText()Android:使用drawText()书写时文本不可见
【发布时间】:2011-04-12 12:49:19
【问题描述】:
          @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");
        }
    }

}

【问题讨论】:

  • 你怎么知道它不起作用?
  • 如果我将最后一行更改为 canvas.drawText("HELLO CANVAS",200,300,paint);有用。但我想知道为什么上面的那个不起作用。从某种意义上说不起作用,它不会在屏幕上打印任何字符!!!
  • 因为屏幕使用canvas,而不是c ...这就是系统为您提供特定画布以供您绘制的原因。
  • 从实际的角度来看,您的提问没有意义。为什么需要两张画布?
  • 因为我在 onDraw() 之外进行计算,而这个计算函数是从 onCreate() 调用的。所以在 onDraw() 我显示一个图形对象,然后我想打印计算值。因为我没有这个画布对象作为 onDraw() 的本地对象

标签: android graphics canvas drawtext


【解决方案1】:

您没有在此处或您的其他问题中提供足够的信息来说明为什么can't do that。没有理由在新的画布上而不是已经存在的画布上绘图。

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

编辑(读完所有cmets后)

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

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

edit2

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

你应该怎么做(我推荐使用 SurfaceView 而不是 View,无论如何...):

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

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

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

【讨论】:

  • 更新了代码!首先我调用 onDraw() 在屏幕上绘制图形对象。然后之后我尝试连续进行计算(因此异步活动)并继续显示结果。
  • 我正在尝试从此链接中的表面视图示例。但不幸的是它只运行了一分钟左右。stackoverflow.com/questions/5650810/…
  • @WarrenFaith 你能帮我解决这个问题吗displaying the text in Canvas ShapeDrawable with RectShape? 没有效果,执行此操作后无法在 Shape 上显示文本 sDrawableRef.getPaint().getTextBounds(s, 0, s.length( ), 界限);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多