web-dev-qa-db-ja.com

android:elevationには下側にのみ影効果がありますが、影効果を上側に表示する方法は?

フラグメントの影の効果を示すために、アクティビティの下部でフレームレイアウトを使用し、Android:elevationを追加します。しかし、影の効果は上側ではなく下側にしか表示されません。アドバイスをいただけますか

<FrameLayout
    Android:id="@+id/bottom_container"
    Android:background="#00737f"
    Android:layout_width="match_parent"
    Android:layout_height="50dp"
    Android:layout_gravity="bottom"
    Android:elevation="4dp"
    Android:layout_alignParentBottom="true"
    Android:layout_marginBottom="50dp"/>
28
Jayce

ビューの上に影を表示するために使用できるトリックがあります。

基本的に、2つのネストされたレイアウトを使用する必要があります。外側のレイアウトはelevationでシャドウを投影し、内側のレイアウトはbackgroundを設定します。次に、外側のレイアウトにpaddingを設定することで、影を動かさずに内側のレイアウトを下に移動でき、より多くの影が見えるようになります。

<FrameLayout
    Android:layout_width="match_parent"
    Android:layout_height="50dp"
    Android:layout_alignParentBottom="true"
    Android:layout_marginBottom="50dp"
    Android:elevation="4dp"
    Android:outlineProvider="bounds"
    Android:paddingTop="2dp"
    Android:layout_marginTop="-2dp">

    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="#00737f">

        <!-- content -->

    </FrameLayout>

</FrameLayout>

ここで重要なのは属性outlineProviderです。これは、背景が設定されていなくても外側のレイアウトに影を落とすために必要です。

さらに、負のmarginを指定して、パディングによって作成されたオフセットを補正します。ユースケースによっては、これを省略できます。

ただし、注意:ビューを大きくシフトしすぎると、いくつかのレンダリングアーティファクトが表示されます。

Android elevation shadow offset examples

Githubのこの例のソース

27
Floern