0

这是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的properties不等于c?(自定义view没有颜色和文字,虽然c是红色有文字)
  2. 第一个和第二个有什么不同canvas = c?正如我所说,结果不同。
4

3 回答 3

0

我认为画布内存固定在某个地方进行渲染。您不能更改画布引用,这意味着您不能使用另一个内存块。因此,如果你想画一些东西,你必须改变输入内存的内容。你同意我的观点吗?

于 2013-07-15T01:10:47.733 回答
0

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

于 2013-07-15T01:14:20.067 回答
0

看看这里。我想这就是你问题的答案。

特别是说:

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

根据您的编辑

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

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

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

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

你在编辑中所说的是正确的,当你在做 canvas = c 时,它恰好等于 c 但现在画布使用的是与 Android 为原始画布对象创建的位图不同的位图,因此有没有图...

希望这可以帮助...

于 2013-07-15T01:17:17.230 回答