【问题标题】:Can we have two canvases in an activity ? (OR) Having a canvas outside the onDraw() is not working我们可以在一个活动中有两个画布吗? (或)在 onDraw() 之外有一个画布不起作用
【发布时间】:2011-04-12 09:39:45
【问题描述】:
@Override
        protected void onDraw(Canvas canvas) {
        // Draw graphic objects
         .....
             }

         public void displayCalc(){

           //Do some calculation & display results near these graphic objects
            String result = String.valueOf(value);

             //Do some calculation

              //Display Calculated values
             Canvas c =new Canvas();
             Paint paint = new Paint();
             paint.setStyle(Paint.Style.FILL);
             paint.setAntiAlias(true);
             paint.setColor(Color.WHITE);
             c.drawText(result,200,300,paint);
                     }

但如果我在 onDraw 函数中有相同的东西,它就可以正常工作。 我想知道为什么或我必须进行哪些更改才能使其正常工作

   @Override
    protected void onDraw(Canvas canvas) {

    // Draw graphic objects 
    //Do some calculation & display results near these graphic objects
     .....
     String result = String.valueOf(value);

        //Display Calculated values
         Paint paint = new Paint();
         paint.setStyle(Paint.Style.FILL);
         paint.setAntiAlias(true);
         paint.setColor(Color.WHITE);
         canvas.drawText(result,200,300,paint);
}

【问题讨论】:

  • 哪个不行?第一个看起来像您正在绘制到与表面无关的画布上,所以我希望这是失败的画布(嗯......不显示任何东西)。
  • 对不起,我错过了一些东西!我现在已经编辑了。它的第一个不显示任何内容
  • displayCalc 是如何调用的?它是在 UI 线程上调用的吗?
  • 正如你在下面所说的,重复你自己的问题 stackoverflow.com/questions/5635434/… 。尽量避免两次问同一个问题...
  • @forsvarir,这不完全是同一个问题,这是我在使用 AsyncTask 时遇到的问题。 (或)如何将画布与 AsyncTasks 一起使用!顺便说一句,我的 displayCalc 是从 Oncreate() 调用的

标签: android graphics


【解决方案1】:

如果您尝试实现某种双缓冲,您可能需要查看this

我认为您的问题是您需要创建一个位图,然后将画布附加到它,例如:

Bitmap bitmap = Bitmap.createBitmap(width, height, Config.RGB_565);
Canvas c = new Canvas(bitmap);

// then draw to the canvas..
// and when you're happy, draw the bitmap onto the canvas supplied to onDraw.

只是创建一个画布,不会让它出现在屏幕上。

您可能还想看看:this tutorial

如果你有一个surfaceView,那么你可以做这样的事情(没有编译器,但希望你能明白要点):

SurfaceView view = (SurfaceView)findViewById(R.id.view);

SurfaceHolder holder = view.getHolder(); // save this where it can be accessed by your function

Canvas c 
try  {
    c = holder.lockCanvas();
    // draw stuff
}
finally {
    if(null != c) {
        holder.unlockCanvasAndPost(c);
    }
}

【讨论】:

  • 我第一次尝试使用surfaceview。我会告诉你它是否有效。谢谢指点!
  • 我试过你指出的教程。我下载了教程中给出的代码,我看到运行一分钟它崩溃/冻结。因为它内存不足。有任何想法吗 ? stackoverflow.com/questions/5650810/…
【解决方案2】:

如果您想拥有两个 SurfaceView,那么只需将它们添加到您的布局中并为它们都提供一个自己的线程(或将两个绘图合并到一个线程中)。

我不明白您为什么要在第一个方法示例中在单独的画布上绘图...也许您提供了更多信息来说明您尝试实现的目标。

【讨论】:

  • OnDraw(Canvas canvas) 被调用,我尝试绘制图形对象。然后之后我继续从 Dataoutputstream 中检索数据,并尝试在图形对象旁边显示。
猜你喜欢
  • 1970-01-01
  • 2012-12-02
  • 2019-01-18
  • 1970-01-01
  • 2019-11-15
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
相关资源
最近更新 更多