Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中设置SurfaceView的背景色_Android_Background_Background Color_Surfaceview_Surfaceholder - Fatal编程技术网

在Android中设置SurfaceView的背景色

在Android中设置SurfaceView的背景色,android,background,background-color,surfaceview,surfaceholder,Android,Background,Background Color,Surfaceview,Surfaceholder,我正在为android构建一个绘画应用程序。扩展SDK提供的FingerPaint应用程序示例。但是,与FingerPaint不同,我使用带有单独渲染线程的SurfaceView绘制曲面。所有这些都是非常标准和直接的。工作顺利。然而,我想给绘画表面一个白色的背景,就像在白纸上画画一样。默认背景为黑色。 曲面视图的线程调用视图的onDraw()方法 这里我面临的问题是,如果我将背景颜色或背景资源设置为我的SurfaceView,那么下次渲染视图时,该背景将覆盖曲面的上一个图形。我将用一个例子来解释

我正在为android构建一个绘画应用程序。扩展SDK提供的FingerPaint应用程序示例。但是,与FingerPaint不同,我使用带有单独渲染线程的SurfaceView绘制曲面。所有这些都是非常标准和直接的。工作顺利。然而,我想给绘画表面一个白色的背景,就像在白纸上画画一样。默认背景为黑色。 曲面视图的线程调用视图的onDraw()方法

这里我面临的问题是,如果我将背景颜色或背景资源设置为我的SurfaceView,那么下次渲染视图时,该背景将覆盖曲面的上一个图形。我将用一个例子来解释这一点:

假设我将背景设置为白色。现在,应用程序启动,我的SurfaceView为白色。好的,到目前为止还不错。现在,我用手指在这个表面上画一条红色的线。该线现在显示在白色表面上。好。现在,这应该是一个绘画应用程序,假设我想画一辆汽车。然后,我用手指画了第二条红线。屏幕上画了第二条线,但我之前画的第一条线消失了。也就是说,因为我已经为我的SurfaceView设置了一些背景,所以再次绘制背景,从而覆盖绘制的第一行。现在,屏幕仅显示绘制的第二条线

显然,我不希望这种情况发生。当我不尝试更改背景时(即,两行都显示在默认的黑色背景上,没有有效的背景),代码可以完美地工作。但是当我设置了一些想要的背景时,事情就发生了。有没有一种方法可以让你有一个静态的背景,而不是每次都画出来?我希望只绘制一次背景,所有后续的绘图都应在此背景上进行。我不希望android运行时在每次绘制我的视图时都绘制背景,从而覆盖该视图上的所有绘图(来自以前的渲染)。有办法解决这个问题吗

我为实现这一目标所做的努力有:

  • 使用android:background在XML中设置我的SurfaceView的背景色

  • 做上述工作,使用风格的概念。(指定样式值并在布局文件中引用它)。该样式仅将背景颜色定义为#FFFFFFFF(白色)

  • 将样式2设置为SurfaceView(RelativeLayout)的父视图

  • 在我的清单文件中使用android:theme将整个应用程序的样式设置为2,作为一个主题

  • 将我的SurfaceView的背景可绘制设置为一幅素色和白色的图像

  • 从代码中将我的SurfaceView的setBackgroundColor调用为this.setBackgroundColor(Color.WHITE)


  • 谢谢。

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

    这也没能奏效。所以现在我得出结论,SurfaceView的背景色是不能改变的。所以现在我放弃了SurfaceView,使用普通视图代替我的绘图。到目前为止,还没有观察到任何性能损失。但是,仅仅因为SurfaceView不允许我更改它的背景颜色,放弃一个高效的实现感觉有点不对

    根据:

    曲面是Z有序的,因此它位于保持其形状的窗口后面 表面观察;SurfaceView在其窗口上打了一个孔,以允许 要显示的曲面。视图层次结构将负责 与曲面正确合成SurfaceView的任何同级 这通常会出现在它上面。这可以用来放置 覆盖层,如表面顶部的按钮,但请注意 它会对性能产生影响,因为完全混合了alpha 每次曲面更改时都将执行合成

    因此,如果通过以下方式更改曲面视图的z顺序:

    setZOrderOnTop(true);
    

    这将起作用,但是您不能将任何其他视图放在曲面视图的顶部。

    您找到解决方案了吗?我也有这个问题。看起来这个答案建议你可以画背景色。这对我很有用: