3

我有一个 FrameLayout,其中首先包含一个 SurfaceView,其次是一个 RelativeLayout,后者又包含各种 Button 和 TextView。

在 SurfaceView 的画布上,我绘制了许多位图,并且通过触摸和运动事件允许用户拖动它们。

这些位图在拖动时会在相对布局内的按钮等下方传递。

现在,我(可能是错误的)理解 SurfaceView 的“Z 级”,或者它所具有的任何东西,与布局其余部分的实际Z 级完全无关。是这样吗?如果是这样,我该如何绕过它,以便将拖动的位图绘制在其他视图之上?或者我可以通过什么其他方式实现全屏画布,但又不让我的按钮等像叠加层的控件一样起作用。

我想我真正需要的是一个底层,触摸事件仍然可以被下面的按钮等拾取。但我不知道如何实现这一点,因为在重绘 Canvas 时,我还必须重绘背景。

能不能把FrameLayout里面RelativeLayout和SurfaceView的顺序调换一下,然后让Canvas的背景透明?如果有怎么办?触摸事件是否仍会“落入”下方的按钮?

感谢您对我的包容,我知道我有点像华夫饼。

4

2 回答 2

2

SurfaceView 不能那样工作。

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

您可以在首次创建 SurfaceView 时控制“表面”层的 Z 顺序,但它将位于所有 View 元素的上方或下方。它不能高于某些视图而低于其他视图,因为它们是完全独立的层。“表面”层不捕获输入事件,因此将其置于顶部(通过SurfaceView#setZOrderOnTop())不会影响输入焦点。

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

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

于 2014-04-17T23:16:23.697 回答
0

你能再澄清一点吗?在您的 SurfaceView 中,您是否分配了背景?如果没有,如果您的意图是简单地拖动碎片,您也可以使用 AbsoluteView。如果没有背景,您应该能够将整个视图放在您拥有的 RelativeView 之上,并且只有各种 Button 等绘制在顶部的视图上,这将是可拖动的并保持在其他所有内容之上。

于 2011-01-12T14:06:30.133 回答