Android で RelativeLayout のビューの z オーダーを定義したいと思います。
これを行う1つの方法は、を呼び出すことbringToFront
です。
これを行うより良い方法はありますか?レイアウト xml で z オーダーを定義できれば素晴らしいと思います。
Android で RelativeLayout のビューの z オーダーを定義したいと思います。
これを行う1つの方法は、を呼び出すことbringToFront
です。
これを行うより良い方法はありますか?レイアウト xml で z オーダーを定義できれば素晴らしいと思います。
最も簡単な方法は、ビューが XML ファイルに追加される順序に注意することです。ファイルの下方は、Z 軸の上方を意味します。
編集: これはAndroid 開発者サイトのhereおよびhereに記載されています。(ありがとう@flightplanner)
API 21 以降のボタンやその他の要素は高度が高いため、親レイアウトに関係なく要素の xml 順序を無視することに注意してください。それを理解するのにしばらく時間がかかりました。
API レベル 21 以降の Android では、レイアウト ファイル内のアイテムは、正解で説明されているように、ファイル内での順序付けの両方から Z オーダーを取得します。高さの値が高いほど、アイテムの Z オーダーが高くなります。 .
これにより、問題が発生することがあります。特に、XML の順序に従って Z オーダーの下にあるはずのアイテムの上に表示されることが多いボタンで問題が発生する可能性があります。これを修正するandroid:elevation
には、レイアウト XML 内のアイテムの を、達成したい Z オーダーと一致するように設定するだけです。
レイアウトで要素の高さを設定すると、影が落ち始めます。この効果が必要ない場合は、次のようなコードで影を削除できます。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
レイアウト xml を使用して、昇格したビューの影を削除する方法が見つかりませんでした。
同じ問題が発生しました。相対レイアウトのparentViewには、2つの子childView1とchildView2があります。まず、childView1 を childView2 の上に置き、childView1 を childView2 の上に置きます。子ビューの順序を変更しても、問題は解決しませんでした。私にとってうまくいったのは、parentView と設定したコードでandroid:clipChildren="false"を設定することです。
childView1.bringToFront();
parentView.invalidate();
view.setZ(float)
API レベル 21 から使用できることに注意してください。詳細については、こちらを参照してください。
の導入以来、私は答えを追加すると思った
アンドロイド:translationZ
XML フィールドは、物事を少し変えました。実行を提案する他の回答
childView1.bringToFront();
parentView.invalidate();
このコードは、XML ファイルにハードコードされた android:translationZ を含むビューの前に childView1 を表示しないことを除いて、完全に適切です。私はこれに問題を抱えていました。このフィールドを他のビューから削除すると、bringToFront() は問題なく機能しました。
RelativeLayout
再定義されたカスタムを使用できます
protected int getChildDrawingOrder (int childCount, int i)
注意してください-このメソッドはi
、「どのビューを描画する必要があるか」としてパラメーターを取りますi'th
。これが仕組みViewPager
です。と組み合わせてカスタム描画順序を設定しPageTransformer
ます。
以下のコードサンプルを使用して、同じことを達成することもできます
ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);
これは下位互換性があります。これmCardView
は、下にあるはずのビューsourceView
です。