我正在为android构建一个paint应用程序。扩展随SDK提供的FingerPaint应用程序示例。但是,与FingerPaint不同,我使用SurfaceView和单独的渲染线程来绘制表面。所有这些都非常标准和直接。运作良好。但是,我希望在绘画表面上给出白色背景,这就像在白纸上画画一样。默认背景为黑色。 我的表面视图的线程调用视图的onDraw()方法。
我面临的问题是,如果我将背景颜色或背景资源设置为SurfaceView,则在下次渲染视图时,此背景将覆盖曲面的上一个绘图。我将用一个例子解释这个:
假设我将背景设置为白色。现在,应用程序启动,我的SurfaceView具有白色。好的,到目前为止还不错。现在,我用手指在这个表面上画了一条红色的线条。该线现在显示在白色表面上。好。现在,这应该是一个绘画应用程序,并假设我想画一辆车。那么,我用手指画出第二条红线。第二行画在屏幕上,但我之前绘制的第一行消失了。也就是说,因为我已经为SurfaceView设置了一些背景,所以再次绘制背景,从而覆盖绘制的第一行。现在屏幕仅显示绘制的第2行。
显然,我不希望这种情况发生。当我不尝试改变背景时(即,在默认的黑色背景上显示两条线,没有有效的背景),代码完美地工作。但是当我设置一些理想的背景时,就会发生这种情况。有没有办法以某种方式有一个静态背景,每次都没有绘制?我希望背景只绘制一次,所有后续绘图都应该在 on 这个背景上进行。我不希望android运行时,每次绘制我的视图时绘制背景,从而覆盖以前渲染中该视图上的所有绘图。有办法解决这个问题吗?
为了达到这个目的,我尝试过的是:
使用android:background in XML设置SurfaceView的背景颜色。
执行上述操作,使用样式的概念。 (指定样式值并在布局文件中引用它)。样式只将背景颜色定义为#FFFFFFFF(白色)。
将样式2设置为SurfaceView的父视图(RelativeLayout)。
将样式2设置为整个应用程序,作为主题,在我的清单文件中使用android:theme。
将SurfaceView的背景绘制设置为纯白色的图像。
从代码中调用我的SurfaceView的setBackgroundColor,this.setBackgroundColor(Color.WHITE)。
感谢。
答案 0 :(得分:2)
表面是Z排序的,因此它位于窗口后面 SurfaceView; SurfaceView在其窗口中打孔以允许它 表面要显示。视图层次结构将负责 正确地与Surface合成SurfaceView的任何兄弟 通常会出现在它上面。这可以用来放置 虽然注意到覆盖在表面顶部的按钮 它可以影响性能,因为完全alpha混合 每次Surface更改
时都会执行复合
因此,如果您通过以下方式更改表面视图的z顺序:
setZOrderOnTop(true);
这样可行,但是你不能在表面视图之上放置任何其他视图。
答案 1 :(得分:1)
现在我还尝试将SurfaceView覆盖在另一个具有白色背景的View上,并将SurfaceView设置为完全透明。我使用了FrameLayout。也就是说,一个带有白色背景的视图覆盖在其上,我的SurfaceView设置为完全透明。
这也失败了。所以现在我得出结论,SurfaceView的背景颜色无法改变。所以现在我已经删除了SurfaceView,并使用普通视图,而不是我的绘图。到目前为止,没有观察到任何性能损失。但是,放弃一个有效的实现感觉有点不对,只是因为SurfaceView不允许我改变它的背景颜色。