web-dev-qa-db-ja.com

AndroidのRelativeLayoutのビューのZ順序の定義

AndroidのRelativeLayoutのビューのz順序を定義したいと思います。

これを行う1つの方法は、bringToFrontを呼び出すことです。

これを行うより良い方法はありますか?レイアウトxmlでzの順序を定義できたら素晴らしいと思います。

212
hpique

最も簡単な方法は、XMLファイルにビューが追加される順序に注意を払うことです。ファイル内の低い位置は、Z軸の高い位置を意味します。

編集:これはAndroid開発者サイトで here および here に文書化されています。 (ありがとう@flightplanner)

297
Steve Haley

コードでこれを行いたい場合は、次のことができます

View.bringToFront();

docs を参照してください

85
QAMAR

API 21以降のボタンやその他の要素は高度が高いため、親レイアウトに関係なく要素のxml順序を無視することに注意してください。それを理解するのにしばらくかかった。

57
Daniel Wilson

APIレベル21から始まるAndroidでは、正解で説明されているように、レイアウトファイル内のアイテムは、ファイル内での順序からZオーダーを取得します。アイテムのZオーダーが高くなります。

これは、特に、XMLの順序に従ってZオーダーでそれらの下にあるはずのアイテムの上にしばしば表示されるボタンで、問題を引き起こすことがあります。これを修正するには、レイアウトXML内のアイテムのAndroid:elevationを、達成したいZオーダーに一致するように設定するだけです。

レイアウトで要素の標高を設定すると、影が投影され始めます。この効果が必要ない場合は、次のようなコードで影を削除できます。

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

レイアウトxmlを使用して、昇格したビューの影を削除する方法が見つかりませんでした。

16
lejonl

同じ問題が発生しました:相対レイアウトのparentViewには、childView1とchildView2の2つの子があります。最初に、childView1をchildView2の上に配置し、childView1をchildView2の上に配置します。子どもたちの見解の順序を変えても、私にとって問題は解決しませんでした。私のために働いたのは、parentViewと設定したコードでAndroid:clipChildren = "false"を設定することです:

childView1.bringToFront();

parentView.invalidate();
13
Tony Vu

APIレベル21からview.setZ(float)を使用できることに注意してください。 ここ 詳細情報を見つけることができます。

12
Vadim Kotov

の導入以来、答えを追加すると思った

Android:translationZ

XMLフィールドは少し物事を変えました。実行を示唆する他の回答

childView1.bringToFront();

parentView.invalidate();

このコードは、XMLファイルにハードコードされたAndroid:translationZがあるビューの前にchildView1を表示しないことを除いて、完全にスポットです。私はこれで問題が発生していました。このフィールドを他のビューから削除すると、bringToFront()は正常に機能しました。

11
ThePartyTurtle

API 21にはview.setElevation(float)ビルドインがあります

後方互換性のためにViewCompat.setElevation(view, float);を使用します

他のメソッドViewCompat.setZ(v, pixels)およびViewCompat.setTranslationZ(v, pixels)

別の方法は、ボタンまたはビュー配列を収集し、addViewを使用してRelativeLayoutに追加します

5
Qamar

childView.bringToFront()が機能しなかったため、最も最近追加されたアイテム(他のすべての子をオーバーレイするアイテム)のZ変換を次のような負の値に設定しました。

lastView.setTranslationZ(-10);

https://developer.Android.com/reference/Android/view/View.html#setTranslationZ(float) を参照してください

3
kip2

RedefinedでカスタムRelativeLayoutを使用できます

protected int getChildDrawingOrder (int childCount, int i)

注意してください-このメソッドは、パラメータiを「どのビューをi'thに描画すべきか」として受け取ります。これがViewPagerの仕組みです。 PageTransformerと組み合わせてカスタム描画順序を設定します。

1
Petrov Dmitrii

XMLのいずれかのビューに昇格があるかどうかを確認します。その場合は、他のアイテムに標高を追加するか、標高を削除して問題を解決します。そこから、それはビューの順序であり、他のものの上に来るものを決定します。

0

同じことを達成するためにも以下のコードサンプルを使用できます

ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);

これには後方互換性があります。ここでmCardViewsourceViewの下にあるべきビューです。

0
Ankit

または、FrameLayout内に重複するボタンまたはビューを配置します。次に、xmlファイルのRelativeLayoutは、追加された子レイアウトの順序を尊重します。

0
fullMoon