1. ホーム
  2. アンドロイド

[解決済み】Androidの "昇降 "に影が表示されない件

2022-03-27 10:40:40

質問

ListViewを持っていて、各リスト項目の下に影を表示させたいと思っています。Android Lollipopの新しい標高機能を使って、影を落としたいViewにZを設定しています。すでにActionBar(Lollipopでは技術的にはToolbar)で効果的に行っています。ロリポップの仰角を使っているのですが、なぜかリストアイテムの下に影が表示されないのです。各リストアイテムのレイアウトはこんな感じです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    style="@style/block"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@color/lightgray"
    >

    <RelativeLayout
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="40dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:elevation="30dp"
        >

        <ImageView
            android:id="@+id/documentImageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/alphared"
            android:layout_alignParentBottom="true" >

            <appuccino.simplyscan.Extra.CustomTextView
                android:id="@+id/documentName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                app:typeface="light"
                android:paddingLeft="16dp"
                android:paddingTop="8dp"
                android:paddingBottom="4dp"
                android:singleLine="true"
                android:text="New Document"
                android:textSize="27sp"/>

            <appuccino.simplyscan.Extra.CustomTextView
                android:id="@+id/documentPageCount"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                app:typeface="italic"
                android:paddingLeft="16dp"
                android:layout_marginBottom="16dp"
                android:text="1 page"
                android:textSize="20sp"/>

        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

しかし、以下はリスト項目を影なしで表示する方法です。

また、以下のようなことも試してみましたが、効果がありません。

  1. 親レイアウトではなく、ImageViewやTextViews自体に標高を設定する。
  2. ImageViewに背景を適用しました。
  3. Elevationの代わりにTranslationZを使用。

解決方法は?

ロリポップでシャドウを少し弄ってみたところ、こんな感じになりました。

  1. どうやら親の ViewGroup の境界は、何らかの理由でその子の影をカットします。
  2. で設定したシャドウを android:elevation はカットオフされます。 View の境界ではなく、マージンを通して拡張された境界です。
  3. 子ビューにシャドウを表示させる正しい方法は、親ビューにパディングを設定し android:clipToPadding="false" をその親の上に置く。

以下は、私が知っていることを基にした提案です。

  1. トップレベルを設定する RelativeLayout で、シャドウを表示させたい相対レイアウトに設定したマージンと同じパディングを持つようにします。
  2. セット android:clipToPadding="false" 同じ RelativeLayout ;
  3. のマージンを削除します。 RelativeLayout も標高が設定されている。
  4. [EDIT] エレベーションが必要な子レイアウトに、非透過の背景色を設定する必要がある場合もあります。

最終的に、トップレベルの相対レイアウトは次のようになります。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/block"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@color/lightgray"
    android:paddingLeft="40dp"
    android:paddingRight="40dp"
    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    android:clipToPadding="false"
    >

内部の相対レイアウトはこのようになります。

<RelativeLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="[some non-transparent color]"
    android:elevation="30dp"
    >