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