Android:引用CustomView的画布?

时间:2013-07-15 00:58:26

标签: android android-canvas ondraw

这是我自定义视图的onDraw()方法:

@Override
    protected void onDraw(Canvas canvas) {
        Paint p = new Paint();
        p.setColor(Color.RED);

        Bitmap bmp = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(),
                Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bmp);
        c.drawARGB(255, 255, 0, 0);
        c.drawText("Text", 50, 50, p);
        canvas = c;

        canvas.drawARGB(255, 0, 0, 255);
        canvas.drawText("Text1", 20, 20, p);
//      canvas = c;
    }

上述方法的结果是没有颜色或任何文本的视图。但是如果我先评论canvas = c并取消注释最新(在块的最后一行),结果将是一个蓝色视图,其中“text1”是出现在正确的位置。它看起来像是onDraw()的覆盖结果:

@Override
    protected void onDraw(Canvas canvas) {
        Paint p = new Paint();
        p.setColor(Color.RED);
        canvas.drawARGB(255, 0, 0, 255);
        canvas.drawText("Text1", 20, 20, p);
    }

为什么引用自定义视图的画布可以对结果进行更改?而且在第一次覆盖时,为什么视图显示为没有颜色且不显示红色?

修改

假设c1,c2是C类的实例,它们是单独创建的。现在如果我们这样做:

c1 = c2;

然后c1的所有属性都等于c2的属性。现在我的问题是:

  1. 为什么当我们使用canvas = c时,canvas的属性将不等于c?(自定义视图没有颜色或文本,尽管c是红色且有文本)
  2. 第一个canvas = c和第二个之间有什么不同?正如我所说,结果是不同的。

3 个答案:

答案 0 :(得分:0)

我认为画布内存已固定在某处以进行渲染。您无法更改画布引用,这意味着您无法使用其他内存块。因此,如果你想画一些东西,你必须改变输入的内存内容。你同意我的观点吗?

答案 1 :(得分:0)

在第一个覆盖中,您正在绘制从位图创建的画布而不是视图的画布,如果您需要在视图上绘制位图,则需要在传递给您的对象上调用canvas类的drawBitmap方法。你正在做什么,会在位图上绘制内容,而不会影响UI中出现的内容。

答案 2 :(得分:0)

看看here。我认为这是你问题的答案。

特别是说:

的部分
  

现在,您的Canvas将绘制到定义的位图上。在使用Canvas绘制它之后,您可以使用Canvas.drawBitmap(Bitmap,...)方法之一将Bitmap携带到另一个Canvas。建议您最终通过View.onDraw()或SurfaceHolder.lockCanvas()为您提供的Canvas绘制最终图形(请参阅以下部分)。

根据您的修改

请阅读我的链接,在某些情况下:

  

在View组件的onDraw()中,使用Canvas.draw ...()方法或其他以drawvas作为参数的类draw()方法为您的所有绘图提供Canvas。一旦你的onDraw()完成,Android框架将使用你的Canvas绘制系统处理的Bitmap。

这里的关键词是“Android框架将使用您的Canvas绘制系统处理的位图”。你在你的例子中做的是从onDraw方法分配一个画布(c),该方法用于与android为画布创建的位图不同的位图,因此不会执行任何绘图。但是,如果您评论第一个canvas = c并取消注释最后发生的是您在正确的位图上绘制蓝色文本,实际上您将获得相同的结果而不取消注释最后一个canvas = c。

尝试使用原始画布对象的drawBitmap函数之一将位图传输到系统创建的位图。

你在编辑中说的是正确的,当你在做canvas = c然后只是画布等于c但是现在画布正在使用Android为原始画布对象创建的一个不同的位图,因此没有绘图...

希望这会有所帮助......