Android:使用drawText()写入时文本不可见

Android:使用drawText()写入时文本不可见,android,graphics,canvas,drawtext,Android,Graphics,Canvas,Drawtext,更多代码 @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 fo

更多代码

          @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);
        }
公共类graphicProj扩展活动{
私人帆布;
@凌驾
创建时的公共void(Bundle savedInstanceState){
{
....
SimpleView SimpleView_obj=新SimpleView(本);
setContentView(simpleview_obj);
simpleview_obj.onDraw(帆布);
.....
新建GetData().execute();
}
私有静态类SimpleView扩展视图{
private ShapeDrawable mDrawable=新的ShapeDrawable();
....    
受保护的void onDraw(画布){
//绘制图形对象
....
}
}
公共类GetData扩展异步任务{
@凌驾
受保护的void onPreExecute(){
日志d(“项目”、“开始”);
}
@凌驾
受保护的空位背景(空位…未使用){
////我的计算和读取frm数据流
}
@凌驾
受保护的void onProgressUpdate(字符串…数据){
//我不断更新结果。。。
油漆=新油漆();
绘制.设置样式(绘制.样式.填充);
paint.setAntiAlias(真);
油漆。设置颜色(颜色。白色);
画布.绘图文本(结果,200,300,绘制);
}
@凌驾
受保护的void onPostExecute(未使用的void){
日志d(“项目”、“结束”);
}
}
}

不在这里,或者在你的其他问题中,你是否提供了足够的信息,说明你为什么不能这样做。没有理由在新画布上而不是现有画布上绘制

代码不起作用,因为您的新画布
c
未分配任何内容。这就像为日志创建字符串
myString
,但从不使用
log.d(标记,myString)

编辑(阅读所有评论后)

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

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

edit2

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

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

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

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


最后一句话:你用正确的方式做了很多事情,只是混淆了你做这些事情的地方。你应该试着重新思考你真正想要实现的目标,以及如何以最简单的方式来实现。也许我的教程可以帮你澄清一点。

不在这里,或者在你的其他问题中,你提供了足够的信息吗为什么
不能这样做
。没有理由在新画布上绘制,而不是在现有画布上绘制

代码不起作用,因为您的新画布
c
未分配任何内容。这就像为日志创建字符串
myString
,但从不使用
log.d(标记,myString)

编辑(阅读所有评论后)

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

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

edit2

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

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

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

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


最后一句话:你用正确的方式做了很多事情,只是把你做事情的地方弄混了。你应该试着重新思考你真正想要达到的目标,以及如何以最简单的方式来完成。也许我的教程可以帮你澄清一点。

你怎么知道它不起作用?如果我把最后一行改为drawText(“HELLO canvas”,200300,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");
        }
    }

}