AndroidのRelativeLayoutのビューのz順序を定義したいと思います。
これを行う1つの方法は、bringToFront
を呼び出すことです。
これを行うより良い方法はありますか?レイアウトxmlでzの順序を定義できたら素晴らしいと思います。
API 21以降のボタンやその他の要素は高度が高いため、親レイアウトに関係なく要素のxml順序を無視することに注意してください。それを理解するのにしばらくかかった。
APIレベル21から始まるAndroidでは、正解で説明されているように、レイアウトファイル内のアイテムは、ファイル内での順序からZオーダーを取得します。アイテムのZオーダーが高くなります。
これは、特に、XMLの順序に従ってZオーダーでそれらの下にあるはずのアイテムの上にしばしば表示されるボタンで、問題を引き起こすことがあります。これを修正するには、レイアウトXML内のアイテムのAndroid:elevation
を、達成したいZオーダーに一致するように設定するだけです。
レイアウトで要素の標高を設定すると、影が投影され始めます。この効果が必要ない場合は、次のようなコードで影を削除できます。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
myView.setOutlineProvider(null);
}
レイアウトxmlを使用して、昇格したビューの影を削除する方法が見つかりませんでした。
同じ問題が発生しました:相対レイアウトのparentViewには、childView1とchildView2の2つの子があります。最初に、childView1をchildView2の上に配置し、childView1をchildView2の上に配置します。子どもたちの見解の順序を変えても、私にとって問題は解決しませんでした。私のために働いたのは、parentViewと設定したコードでAndroid:clipChildren = "false"を設定することです:
childView1.bringToFront();
parentView.invalidate();
APIレベル21からview.setZ(float)
を使用できることに注意してください。 ここ 詳細情報を見つけることができます。
の導入以来、答えを追加すると思った
Android:translationZ
XMLフィールドは少し物事を変えました。実行を示唆する他の回答
childView1.bringToFront();
parentView.invalidate();
このコードは、XMLファイルにハードコードされたAndroid:translationZがあるビューの前にchildView1を表示しないことを除いて、完全にスポットです。私はこれで問題が発生していました。このフィールドを他のビューから削除すると、bringToFront()は正常に機能しました。
API 21にはview.setElevation(float)
ビルドインがあります
後方互換性のためにViewCompat.setElevation(view, float);
を使用します
他のメソッドViewCompat.setZ(v, pixels)
およびViewCompat.setTranslationZ(v, pixels)
別の方法は、ボタンまたはビュー配列を収集し、addView
を使用してRelativeLayoutに追加します
childView.bringToFront()が機能しなかったため、最も最近追加されたアイテム(他のすべての子をオーバーレイするアイテム)のZ変換を次のような負の値に設定しました。
lastView.setTranslationZ(-10);
https://developer.Android.com/reference/Android/view/View.html#setTranslationZ(float) を参照してください
RedefinedでカスタムRelativeLayout
を使用できます
protected int getChildDrawingOrder (int childCount, int i)
注意してください-このメソッドは、パラメータi
を「どのビューをi'th
に描画すべきか」として受け取ります。これがViewPager
の仕組みです。 PageTransformer
と組み合わせてカスタム描画順序を設定します。
XMLのいずれかのビューに昇格があるかどうかを確認します。その場合は、他のアイテムに標高を追加するか、標高を削除して問題を解決します。そこから、それはビューの順序であり、他のものの上に来るものを決定します。
同じことを達成するためにも以下のコードサンプルを使用できます
ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);
これには後方互換性があります。ここでmCardView
はsourceView
の下にあるべきビューです。
または、FrameLayout内に重複するボタンまたはビューを配置します。次に、xmlファイルのRelativeLayoutは、追加された子レイアウトの順序を尊重します。