2013-07-26 68 views
4

我已通过扩展视图创建了自定义视图。Android:在新画布上绘图

public class CustomView extends View { 
     private Canvas canvas2; 
     private Bitmap backingBitmap; 

在CustomView的构造函数中,我有以下代码:

backingBitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); 
canvas2 = new Canvas(backingBitmap); 

在onDraw有,我有:

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawCircle(100, 100, 50, paint); 
    canvas2.drawCircle(0, 0, 10, paint); 
} 

我可以看到,被使用绘制的圆 “画布” 对象,但不是使用“canvas2”对象绘制的那个。 我的理解是,只需要创建一个可变的位图并使其成为Canvas的支持位图。有人能指出这里有什么问题吗?

奖励问题:自定义画布对象在屏幕上创建的位置,以及如何设置其位置?

创建多个画布的原因:我有一个包含整个屏幕的SurfaceView。所以,它的画布基本上覆盖了整个屏幕。我需要在屏幕上制作一个类似窗口的矩形,并且需要在该窗口的边界内设置动画。基本上,如果您在此窗口中翻译图像,则图像不应在窗口边界外绘制。

干杯!

+1

你为什么要把canvas2的内容画出来 – Blackbelt

+0

坦率地说,我只是预计这会起作用。我认为会有电话会将自定义画布附加到Surface上或沿着这些线条。我无法在文档中找到更多信息。在网上搜索解决方案也没有产生有益的结果。什么是创建新画布的正确过程? –

+0

Fst是您自定义的'Canvas'对象有效或无效,绝对是您的'canvas2'不会在您的**表面**上渲染。当你创建视图附加到窗口。在这一点上,它具有表面开始绘制,它给你''onDraw()'方法提供的'canvas'参考。那么你的表面如何知道你已经创建了另一个画布对象......想想这个。 – Gru

回答

6

我明白我的理解有什么问题。现在看来这一切都很简单!这link帮助。

基本上,当我们创建一个Canvas对象时,它创建了一个可以保存我们绘图调用的屏幕外画布。这个Canvas对象需要一个可变的位图来支持,以便所有的图形最终都被存储到这个位图上。绘图完成后,您可以使用绑定到表面的画布(您在onDraw中获取的画布)绘制可变位图。

在我的代码中,我做了以下更改以使其工作。

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawCircle(100, 100, 50, paint); 
    canvas2.drawCircle(25, 25, 25, paint); 
    canvas.drawBitmap(backingBitmap, 200, 90, paint); 
} 
+0

伟大的问题和答案,面临同样的问题。两者皆为+1。谢谢! –