我有一个框架布局,第一个包含surfaceview,第二个包含relativelayout,依次包含各种按钮和文本视图。
在surfaceview的画布上,我绘制了许多位图,通过触摸和运动事件,用户可以拖动它们。
当拖动这些位图时,它们会在相对论布局内的按钮等下方通过。
现在,我(可能弄错了)的理解是,surfaceview的“z-level”或者它所拥有的任何东西都与布局其余部分的实际z-level完全无关。是这样吗?如果是这样,我该如何绕过它,以便将拖动的位图绘制到其他视图上?或者还有什么其他方法可以实现一个全屏画布,但我的按钮等行为像覆盖控制。
我想我真正需要的是一个底层,在那里触摸事件仍然可以被下面的按钮等拾取。但我不知道如何实现这一点,因为,当重新绘制我的画布时,我还必须重新绘制背景。
我可以在framelayout中交换relativelayout和surfaceview的顺序,然后使画布的背景透明吗?如果是这样怎么办?触摸事件是否仍会“穿透”到下面的按钮?
谢谢你陪我,我知道我有点华夫饼。
最佳答案
surfaceview不是那样工作的。
surface view有两个部分,“view”部分和“surface”部分。“视图”部分是一个透明的孔,它与其他视图元素一起布局,并合成到视图层上。“surface”部分是一个完全独立的层,将被定位和缩放以匹配“view”部分,并由系统合成器而不是应用程序进行合成。
第一次创建surface view时,可以控制“surface”层的z顺序,但它将位于所有视图元素的上方或下方。它不能在某些视图之上,也不能在其他视图之下,因为它们是完全独立的层。“surface”层不捕捉输入事件,因此将其放在顶部(通过SurfaceView#setZOrderOnTop()
)不会影响输入焦点。
对于API 14+,您可以使用一个TextureView,它以一种更友好的视图方式运行。
编辑:有关详细信息,请参见much longer explanation。