我有一个FrameLayout,首先包含一个SurfaceView,然后是一个RelativeLayout,它依次包含各种Buttons和TextView。
在SurfaceView的画布上,我正在绘制大量的位图,并且,通过触摸和动作事件,我允许用户拖动它们。
这些位图在拖动时传递位于RelativeLayout内的按钮等下面。
现在,我的(可能是错误的)理解是SurfaceView的“Z级”,或者它传递给它的任何东西,与实际的 Z级完全无关。布局的其余部分。是这样的吗?如果是这样,我怎么能绕过它,以便在其他视图的顶部绘制拖动的位图?或者我可以采用其他方式实现全屏画布,但没有我的按钮等就像覆盖的控件一样。
我想我真正需要的是底层,其中触摸事件仍然可以被下面的按钮等拾取。但我不知道如何实现这一点,因为在重绘我的Canvas时,我还必须重新绘制背景。
我可以在FrameLayout中交换RelativeLayout和SurfaceView的顺序,然后使Canvas的背景透明吗?如果是这样的话?接触事件是否会“落到”下面的按钮?
感谢与我的关系,我知道我有点像一名华夫饼干。
答案 0 :(得分:1)
SurfaceView无法正常工作。
SurfaceView有两个部分,“视图”部分和“表面”部分。 “视图”部分是一个透明孔,与其他视图元素一起布局,并合成到视图层上。 “表面”部分是一个完全独立的层,它将被定位和缩放以匹配“视图”部分,并由系统合成器而不是应用程序合成。
首次创建SurfaceView时,您可以控制“曲面”图层的Z顺序,但它将位于所有View元素的上方或下方。它不能高于某些视图而低于其他视图,因为它们是完全独立的层。 “surface”图层不会捕获输入事件,因此将其置于顶部(通过SurfaceView#setZOrderOnTop()
)不会影响输入焦点。
对于API 14+,您可以使用TextureView,它的行为方式更友好。
修改了解完整详情,请参阅much longer explanation。
答案 1 :(得分:0)
你能澄清一点吗?在SurfaceView中,您是否指定了背景?如果没有,如果您打算简单地拖动碎片,您可能也可以使用AbsoluteView。如果没有背景,您应该能够将整个视图放在您拥有的RelativeView上方,并且只能在顶部的视图上绘制各种按钮,这些按钮可以拖动并保持在其他所有位置之上。