这是我自定义视图的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的属性。现在我的问题是:
canvas = c
时,canvas的属性将不等于c?(自定义视图没有颜色或文本,尽管c是红色且有文本)canvas = c
和第二个之间有什么不同?正如我所说,结果是不同的。答案 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为原始画布对象创建的一个不同的位图,因此没有绘图...
希望这会有所帮助......