在Android中为SurfaceView设置背景颜色

7
我正在为Android构建一款绘画应用程序,扩展了SDK提供的FingerPaint应用程序示例。但是,与FingerPaint不同,我使用SurfaceView和单独的渲染线程来绘制表面。所有这些都非常标准和简单。工作得很好。然而,我想要给绘画表面一个白色背景,就像在白纸上绘画一样。默认背景颜色是黑色的。
我的SurfaceView的线程调用视图的onDraw()方法。我在这里遇到的问题是,如果我将背景颜色或背景资源设置为我的SurfaceView,当下一次呈现视图时,此背景将覆盖表面的先前绘制。我将通过一个例子来解释这个问题:
假设我将背景设置为白色。现在,应用程序启动,我的SurfaceView具有白色。好的,目前为止很好。现在,我用手指在这个表面上画了一条红色的线。这条线现在显示在白色表面上。好的。现在,这应该是一款绘画应用程序,并且假设我想画一辆车。所以,然后,我用手指画了第二条红线。第二条线被画在屏幕上,但是之前我画的第一条线消失了。也就是说,因为我在SurfaceView上设置了一些背景,所以会再次绘制背景,从而覆盖之前绘制的第一条线。现在屏幕只显示第二条线。
显然,我不希望发生这种情况。当我不尝试更改背景时,代码运行得很完美(也就是说,在默认黑色背景下,两条线都被显示出来,没有背景)。但是当我设置了一些期望的背景时,这件事就会发生。有没有办法在某种程度上拥有一个静态背景,它不会每次都被绘制?我希望仅在此背景上绘制所有后续图形。我不希望Android运行时每次绘制视图时都绘制背景,从而覆盖之前呈现的所有绘图。有没有方法可以解决这个问题?
我尝试过的方法有:
1.在XML中使用android:background设置SurfaceView的背景颜色。
2.使用样式的概念执行上述操作(指定样式值并在布局文件中引用它)。该样式仅将背景颜色定义为#FFFFFFFF(白色)。
3.将第2步的样式设置为SurfaceView的父视图(RelativeLayout)。
4.将第2步的样式设置为整个应用程序的主题,使用我的清单文件中的android:theme。
5.将SurfaceView的背景可绘制设置为纯白色图像。
6.从代码中调用setBackgroundColor为SurfaceView设置背景颜色,如this.setBackgroundColor(Color.WHITE)。
谢谢。

你找到解决方案了吗?我也有那个问题。 - disorderdev
看起来这个答案建议你可以为背景颜色涂上颜色。对我有用:http://stackoverflow.com/questions/8104789/how-to-set-backgroundcolor-to-a-surfaceview-in-android - Scott Chamberlin
2个回答

2
根据安卓文档,Surface是按Z顺序排列的,因此它在持有SurfaceView的窗口后面;SurfaceView在其窗口上打洞以允许显示其表面。视图层次结构将负责正确地与Surface合成SurfaceView的任何兄弟姐妹,这些兄弟姐妹通常会出现在其上方。这可用于放置覆盖物,例如按钮,位于表面之上,但请注意,这可能会影响性能,因为每次Surface更改时都会执行完整的Alpha混合合成。因此,如果您要通过以下方式更改SurfaceView的Z顺序:
setZOrderOnTop(true);

这样做是可行的,但是你就不能在SurfaceView上面放置任何其他视图。

1

我也尝试将我的SurfaceView与白色背景的另一个视图叠加,并将SurfaceView设置为完全透明。我使用了FrameLayout。也就是说,一个带有白色背景的视图,上面覆盖着我设置为完全透明的SurfaceView。

这也没有成功。所以现在我得出结论,SurfaceView的背景颜色无法更改。因此,我放弃了SurfaceView,改用普通视图来绘制。到目前为止,还没有观察到任何性能损失。但是,仅仅因为SurfaceView不允许我更改其背景颜色,就放弃了一种高效的实现方式,感觉有点不对劲。


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