安卓:SurfaceView和Z层级问题

3
我有一个FrameLayout,其中包含首先是SurfaceView,其次是RelativeLayout,后者又包含各种按钮和文本视图。
在SurfaceView的画布上,我正在绘制许多位图,并且通过触摸和动作事件允许用户将它们拖动。
这些位图在拖动时会经过RelativeLayout中包含的按钮等控件的下方。
现在,我的(可能错误的)理解是,SurfaceView的“Z级别”或其他类似的内容与布局中其余部分的实际Z级别完全无关。是这样吗?如果是这样,我该怎么解决这个问题,使得拖动的位图可以在其他视图之上绘制?还有什么其他方法可以实现全屏画布而不像覆盖层的控件一样影响我的按钮等?
我想我实际上需要一个底层,可以在下面捕获到按钮等控件的触摸事件。但是我不知道如何实现这一点,因为在重新绘制我的Canvas时,我还必须重新绘制背景。
我可以交换FrameLayout中RelativeLayout和SurfaceView的顺序,然后使Canvas的背景透明吗?如果可以,如何实现?触摸事件是否仍会“穿透”到下面的按钮?
感谢您耐心地阅读,我知道自己有点啰嗦。
2个回答

2

SurfaceView不能这样使用。

SurfaceView有两个部分,"view"部分和"surface"部分。"view"部分是一个透明的空洞,与其他视图元素一起布局,并且合成到视图层上。"surface"部分是一个完全独立的层,它将被定位和缩放以匹配"view"部分,并由系统合成器而不是应用程序合成器进行合成。

创建SurfaceView时,可以控制"surface"层的Z顺序,但它将在所有视图元素之上或之下。它不能在某些视图之上或之下,因为它们是完全独立的层。"surface"层不会捕获输入事件,因此通过SurfaceView#setZOrderOnTop()将其置于顶部不影响输入焦点。

对于API 14+,您可以使用TextureView,它以更加友好的方式运行。

编辑:有关完整详细信息,请参见更长的解释


0

你能再澄清一下吗?在你的SurfaceView中,是否已经分配了一个背景?如果没有,如果你只是想简单地拖动一些元素,你可能也可以使用AbsoluteView。如果没有背景,你应该能够将整个视图放置在你所拥有的RelativeView上方,并且只在顶部的视图上绘制各种按钮等,这些按钮可以被拖动并保持在其他所有内容之上。


嗨,感谢您的回复。当拖动位图时,在 MotionEvent 过程中它会留下一系列重新绘制的副本,除非在绘制所述位图的当前位置之前将 Canvas 背景设置为 COLOR.Black 等。因此,是的,SurfaceView/Canvas 有一个背景。 - JimBadger

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