回答:
最も簡単な方法は、ビューがXMLファイルに追加される順序に注意を払うことです。ファイルの下部が低いほど、Z軸の上部が高いことを意味します。
APIレベル21以降のAndroidでは、レイアウトファイル内のアイテムは、正しい回答で説明されているように、ファイル内での順序付けからZオーダーを取得します。また、高度から、高度値が高いほど、アイテムはZオーダーが高くなります。 。
これにより、特に、XMLの順序に従ってZオーダーでそれらの下にあるはずの項目の上に頻繁に表示されるボタンで、問題が発生することがあります。これを修正するにandroid:elevation
は、レイアウトXMLの項目のを設定して、達成したいZオーダーに一致させます。
レイアウトで要素の高さを設定すると、影が付き始めます。この効果が必要ない場合は、次のようなコードで影を削除できます。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
レイアウトxmlを使用して、高架ビューの影を削除する方法が見つかりませんでした。
android:elevation="1000dp"
。この方法では影はレンダリングされません。
同じ問題が発生しました。相対レイアウトparentViewには、childView1とchildView2の2つの子があります。最初に、childView1をchildView2の上に置き、childView1をchildView2の上に配置します。子供のビューの順序を変更しても問題は解決しませんでした。私にとってうまくいったのは、parentViewと設定したコードでandroid:clipChildren = "false"を設定することです。
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
でparent.invalidate()
動作しますが、parent.bringChildToFront(child)
しません。私たち全員がOSに期待するロジックはどこにありますか?
android:clipChildren="false"
にトリックをしました。ありがとうございました!
の導入以来、私は答えを追加すると思いました
android:translationZ
XMLフィールドは少し変わった。実行を示唆する他の答え
childView1.bringToFront();
parentView.invalidate();
このコードは、XMLファイルでハードコードされたandroid:translationZを使用してビューの前にchildView1を表示しないため、完全に例外です。これに問題があり、他のビューからこのフィールドを削除すると、bringToFront()が正常に機能しました。
elevation
childView.bringToFront()が機能しなかったため、最も追加されていないアイテム(他のすべての子をオーバーレイしていたアイテム)のZ変換を次のような負の値に設定しました。
lastView.setTranslationZ(-10);
詳しくはhttps://developer.android.com/reference/android/view/View.html#setTranslationZ(float)をご覧ください
RelativeLayout
再定義でカスタムを使用できます
protected int getChildDrawingOrder (int childCount, int i)
注意してください-このメソッドはparam i
を「どのビューを描画するかi'th
」として受け取ります。これがどのようにViewPager
機能するかです。と組み合わせてカスタムの描画順序を設定しPageTransformer
ます。