237

Android で RelativeLayout のビューの z オーダーを定義したいと思います。

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

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

4

13 に答える 13

324

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

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

于 2010-04-10T18:18:20.257 に答える
90

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

View.bringToFront();

ドキュメントを参照

于 2013-02-13T06:13:33.417 に答える
77

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

于 2016-09-19T12:13:51.987 に答える
25

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

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

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

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

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

于 2016-07-22T22:52:44.203 に答える
16

同じ問題が発生しました。相対レイアウトのparentViewには、2つの子childView1とchildView2があります。まず、childView1 を childView2 の上に置き、childView1 を childView2 の上に置きます。子ビューの順序を変更しても、問題は解決しませんでした。私にとってうまくいったのは、parentView と設定したコードでandroid:clipChildren="false"を設定することです。

childView1.bringToFront();

parentView.invalidate();
于 2014-10-01T08:58:29.180 に答える
16

view.setZ(float)API レベル 21 から使用できることに注意してください。詳細については、こちらを参照してください。

于 2015-04-17T15:59:55.533 に答える
15

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

アンドロイド:translationZ

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

childView1.bringToFront();

parentView.invalidate();

このコードは、XML ファイルにハードコードされた android:translationZ を含むビューの前に childView1 を表示しないことを除いて、完全に適切です。私はこれに問題を抱えていました。このフィールドを他のビューから削除すると、bringToFront() は問題なく機能しました。

于 2015-08-20T16:39:04.373 に答える
1

RelativeLayout再定義されたカスタムを使用できます

protected int getChildDrawingOrder (int childCount, int i)

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

于 2016-03-05T14:17:57.833 に答える
0

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

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

これは下位互換性があります。これmCardViewは、下にあるはずのビューsourceViewです。

于 2019-08-16T10:57:47.880 に答える