2010-04-10 42 views
183

我想定義Android中RelativeLayout視圖的z順序。在Android中定義RelativeLayout視圖的Z順序

我知道這樣做的一種方法是撥打bringToFront

是否有更好的方法來做到這一點?如果我可以在佈局xml中定義z順序,那將是非常好的。

+4

查看添加它.bringToFront();是anser – 2016-06-22 10:24:59

回答

268

最簡單的方法是簡單地注意視圖添加到XML文件的順序。在文件中降低意味着在Z軸上向上。

編輯: 在Android開發人員網站上記錄爲herehere。 (感謝@flightplanner)

+2

謝謝Steve H!此功能是否記錄在某處?我不希望我的佈局打破新的Android版本。 – hpique 2010-04-10 18:26:25

+0

嗯,我不確定。稍後我會挖掘一下,看看我能找到什麼。然而其他地方也使用相同的原則;畫布(用於二維圖形)以同樣的方式工作。所以我懷疑這不會改變。不過,這是一件好事,要檢查。 – 2010-04-10 23:25:07

+14

這是不幸的,並不總是可以改變。例如,在一個相對佈局,每個元素只能相對於以前的文件 – Casebash 2010-05-20 02:20:37

76

如果你想這樣做的代碼 你可以做

View.bringToFront(); 

看到docs

13

我遇到了同樣的問題:在一個相對佈局parentView,我有2個孩子childView1和childView2。起初,我把childView1放在childView2的上面,我想讓childView1放在childView2的上面。改變兒童觀點的順序並不能解決我的問題。什麼工作對我來說是設置機器人:clipChildren =上parentView和代碼「假」我設置:

childView1.bringToFront(); 

parentView.invalidate(); 
+2

這是工作,Android讓我很傷心。 ''child.bringToFront()'用'parent.invalidate()'工作,但'parent.bringChildToFront(child)'不。我們都期望從操作系統中獲得什麼邏輯? – 2015-05-06 15:21:43

+2

在'LinearLayout'中弄亂了孩子們的訂單... – 2015-07-10 12:05:10

10

請注意,您可以使用view.setZ(float)從API級別開始21 Here你可以找到更多信息。

+0

setz在API級別21以下不可用。並bringtoFront()有閃爍的問題。任何想法實現相同? – 2016-02-15 10:50:47

8

想我會添加一個答案,因爲引進了

的android:translationZ

XML領域變化的東西一點點。在XML文件中translationZ:該建議運行

childView1.bringToFront(); 

parentView.invalidate(); 

其他的答案是完全當場就除了這個代碼不會帶來childView1在任何視圖中的正面配有一塊硬編碼的機器人。我遇到了這個問題,一旦我從其他視圖中刪除了這個字段,bringToFront()就工作得很好。

+0

這對於android 5的「海拔」也是如此。 – shelll 2015-08-20 16:43:53

2

childView。bringToFront()並沒有爲我工作,所以我設置了至少最近添加的項目(這就是一個覆蓋所有其他子女)爲負值,像這樣的Z翻譯:

lastView.setTranslationZ(-10);

看到https://developer.android.com/reference/android/view/View.html#setTranslationZ(float)更多

+0

謝謝,這有助於我在本機底部導航欄之上繪製視圖。由於某種原因,儘管位於xml – Granjero 2017-05-31 14:40:00

+0

中,但它仍處於最佳狀態謝謝,僅適用於API 21及更高版本。 – noe 2017-07-11 15:39:33

10

在Android中從API級別21開始,在佈局文件中的項目得到他們是如何在文件中有序,在正確答案描述,並從他們擡高他們的Z順序都,海拔較高值意味着物品得到更高的Z順序。

這有時會引起問題,特別是經常出現在項根據XML的順序應低於它們的Z次序的頂部的按鈕。要解決這個問題,只需將佈局XML中項目的android:elevation設置爲與要實現的Z順序相匹配即可。

我你設置佈局元素的高度將開始蒙上了一層陰影。如果你不想要這個效果,你可以用代碼中刪除的影子,像這樣:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    myView.setOutlineProvider(null); 
} 

我還沒有發現任何方式,通過佈局文件刪除正視圖的影子。

32

請注意,在API按鈕和其他元件21和更大的具有高海拔,因此忽略元素的XML順序考慮父佈局。花了我一段時間來弄清楚這一點。

+5

是的,它確實如此。花了我幾個小時才意識到它.. – aldok 2017-01-20 22:25:31

+4

對於我來說,這個錯誤的解決方案是在我想在按鈕上呈現的視圖上調用setElevation(1000)。 – Shaegorath 2017-05-22 16:23:10

+0

謝謝。在閱讀您的答案之前,我摸了一下頭,然後理解爲什麼在稍後添加的廣告視圖上方顯示一個按鈕。 – Hong 2017-10-19 21:40:40

2

API 21具有view.setElevation(float)內建

使用ViewCompat.setElevation(view, float);爲了向後兼容

更多方法ViewCompat.setZ(v, pixels)ViewCompat.setTranslationZ(v, pixels)

花葯方式收集按鈕或視圖陣列並在結束

相關問題