安卓:在新画布上绘制

4

我通过扩展View创建了一个自定义视图。

    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);
}

我能看到使用“canvas”对象绘制的圆形,但无法看到使用“canvas2”对象绘制的圆形。我的理解是只需要创建一个可变位图并使其成为画布的后备位图即可。有人能指出这里有什么问题吗?
额外问题:自定义画布对象在屏幕上创建在哪里?如何设置它的位置?
创建多个画布的原因:我有一个SurfaceView,它包含整个屏幕。因此,基本上它的画布覆盖了整个屏幕。我需要在屏幕内创建一个类似窗口的矩形,并且必须在该窗口的边界内进行动画处理。基本上,如果您在此窗口中平移图像,则不应在窗口的边界外绘制图像。
干杯!

1
你为什么期望canvas2的内容被绘制? - Blackbelt
坦白说,我只是半信半疑这会起作用。我以为会有调用将自定义画布附加到Surface或类似操作的情况。我在文档中找不到更多信息。在网上寻找解决方案也没有帮助。创建新画布的正确流程是什么? - Dev N
首先,如果您的自定义“Canvas”对象无效,则您的“canvas2”绝对不会在您的surface上呈现。当您创建视图并将其附加到窗口时,它具有表面开始绘制,它会通过onDraw()方法提供给您canvas引用。那么您的表面如何知道您已经创建了另一个画布对象...请考虑一下这个问题。 - Gru
我理解你想表达的意思,即Surface不知道我创建的画布。我正在尝试找出如何使Surface意识到这一点。如果不可能,那么创建多个画布的正确程序是什么?编辑:如果无法创建多个画布,那么如何实现我在问题中描述的“创建多个画布的原因”? - Dev N
1个回答

7
我找出了我的理解问题,并且现在一切看起来都很简单!这个链接很有帮助。
基本上,当我们创建一个Canvas对象时,它会创建一个屏幕外的画布,用于保存我们的绘制调用。这个Canvas对象需要由可变的Bitmap支持,以便最终将所有的绘制内容存储到该位图中。完成绘制后,可以使用与表面相关联的画布(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);
}

很棒的问题和答案,我也遇到了同样的问题。为两者点赞。谢谢! - Rahul Sainani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接