2

我有一个FrameLayout包含第一个SurfaceView,第二个是RelativeLayout,它依次连接各种Button和TextViews。Android:SurfaceView和Z-Level问题

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

这些位图在拖动时通过下方的位于RelativeLayout内部的按钮等。

现在,我的(可能是错误的)了解,即SurfaceView的“Z-level”或任何它所传递给它的内容完全与其余布局的Z级别无关。是这样吗?如果是这样,我该如何解决这个问题,以便拖动位图被绘制在其他视图的顶部?或者还有什么其他方式可以实现全屏画布,但没有我的按钮等,就像叠加层的控件一样。

我想我实际上需要的是底层,其中触摸事件仍然可以通过下方的按钮等拾取。但我不知道如何实现这一点,因为在重画Canvas时,我也必须重绘背景。

我可以交换在FrameLayout中的RelativeLayout和SurfaceView的顺序,然后使Canvas的背景透明吗?如果是这样如何?触摸事件是否会“落在”下面的按钮?

感谢您的支持与我,我知道我有点华夫。

回答

0

你能澄清一点点吗?在你的SurfaceView中,你是否分配了背景?如果不是,如果你的目的是简单地拖动一些东西,你也可以使用AbsoluteView。如果没有背景,则应该能够将整个视图放置在您拥有的RelativeView上方,并且只有各种按钮以及顶部视图上绘制的视图,这些视图可拖动并保持在其他所有视图之上。

+0

嗨,谢谢你的回复。 当拖动位图时,它会在MotionEvent期间留下自己的重绘副本的痕迹,除非在绘制所述位图的当前位置之前将Canvas背景设置为比如COLOR.Black。所以,是的,SurfaceView/Canvas有一个背景。 – JimBadger 2011-01-12 14:41:26

1

SurfaceView不能这样工作。

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

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

对于API 14+,你可以使用一个TextureView,它以更友好的方式工作。

编辑:了解详情,请参阅much longer explanation