我正在为android构建一个油漆应用程序。扩展SDK提供的FingerPaint应用程序示例。但是,与FingerPaint不同的是,我使用带有单独呈现线程的SurfaceView绘制到表面。所有这些都是非常标准和直接的。工作得很好。然而,我想给画表面画一个白色的背景,所以这就像在白纸上画画一样。默认背景是黑色的。曲面视图的线程调用视图的onDraw()方法。
我在这里面临的问题是,如果我将背景颜色或背景资源设置为我的SurfaceView,则此背景将在下一次呈现视图时覆盖该表面的先前绘图。我将以一个例子来解释这一点:
假设我把背景设置为白色。现在,应用程序开始了,我的SurfaceView具有白色。好吧,到目前为止还不错。现在,我用我的手指在这个表面画一条红色的线。这条线现在显示在白色的表面。好的。现在,这应该是一个绘画应用,假设我想画一辆车。所以,我用手指画出第二条红线。第二行画在屏幕上,但第一行,我以前画的,消失了。也就是说,因为我已经为我的SurfaceView设置了一些背景,所以会再次绘制背景,从而覆盖所绘制的第一行。现在屏幕只显示绘制的第二行。
显然,我不希望这种情况发生。当我不试图改变背景(也就是说,这两行都显示在默认的黑色背景上,没有有效的背景)时,代码工作得很好。但当我设定一些想要的背景时,事情就会发生。有没有办法有一个静态的背景,而不是每次都画?我希望背景只绘制一次,所有后续的图纸都应该发生在这个背景上。我不想让android运行时,每次它绘制我的视图时,都要绘制背景,从而覆盖以前渲染的视图上的所有当前绘图。有办法解决这个问题吗?
为了达到这一目标,我尝试了以下几点:
谢谢。
发布于 2012-03-20 02:52:22
该曲面是Z排序的,因此它位于保持其SurfaceView的窗口后面;SurfaceView在其窗口中穿孔以允许显示其表面。视图层次结构将处理与Surface正确组合的任何通常会出现在其之上的SurfaceView的兄弟级。这可以用于在曲面顶部放置诸如按钮之类的覆盖层,但是请注意,它可能会对性能产生影响,因为每次表面变化时都会执行完全的α混合组合。
因此,如果您通过以下方法更改表面视图的z顺序:
setZOrderOnTop(true);
这是可行的,但你不能将任何其他视图放在表面视图之上。
发布于 2011-12-16 09:39:03
现在,我还尝试将我的SurfaceView覆盖到另一个带有白色背景的视图上,并将SurfaceView设置为完全透明。我用FrameLayout来做这个。也就是说,一个白色背景的视图,覆盖在上面的是我的SurfaceView设置为完全透明。
这也不起作用。因此,现在我得出结论,SurfaceView的背景颜色是不能改变的。所以现在我已经放弃了SurfaceView,并使用了一个正常的视图,而不是我的图纸。到目前为止,还没有发现任何性能损失。但是,仅仅因为SurfaceView不允许我改变它的背景颜色,放弃高效的实现感觉是不对的。
https://stackoverflow.com/questions/8517447
复制相似问题