web-dev-qa-db-ja.com

Androidの「標高」に影が表示されない

私はListViewを持っています、そして各リスト項目でそれの下に影を見せたいです。私はAndroid Lollipopの新しい標高機能を使用して、影を落としたいZをビューに設定しています。すでにActionBar(厳密にはLollipopのツールバー)を使ってこれを効果的に行っています。 Lollipopの標高を使用していますが、何らかの理由でリスト項目の下に影が表示されません。各リストアイテムのレイアウトは次のように設定されています。

<?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>

しかし、これはリスト項目を影なしで表示する方法です。 enter image description here

私は無駄にするために次のことも試みました:

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

私はLollipopで少し影をかけて遊んでいましたが、これが私が見つけたものです:

  1. 親のViewGroupの境界が何らかの理由でその子の影をカットオフしているようです。そして
  2. Android:elevationで設定された影は、Viewの境界によってカットオフされます。マージンを超えて拡張される境界ではありません。
  3. 子ビューに影を表示させる正しい方法は、親にパディングを設定し、その親にAndroid:clipToPadding="false"を設定することです。

これは私が知っていることに基づいたあなたへの私の提案です:

  1. 最上位のRelativeLayoutを、影を付けたい相対レイアウトで設定した余白と同じ余白になるように設定します。
  2. Android:clipToPadding="false"を同じRelativeLayoutに設定します。
  3. 標高も設定されているRelativeLayoutからマージンを削除します。
  4. [編集]昇格が必要な子レイアウトには不透明な背景色を設定する必要があるかもしれません。

一日の終わりには、あなたのトップレベルの相対的なレイアウトはこのようになるはずです。

<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"
    >
334
Justin Pollard

あなたが背景のないビューを持っているなら、この行はあなたを助けるでしょう

Android:outlineProvider="bounds"

デフォルトでは影はビューの背景によって決定されるため、背景がない場合は影もありません。

254

どうやら、あなたは単にビューに標高を設定してそれを表示させることはできません。背景も指定する必要があります。

私のLinearLayoutに追加された次の行はついに影を示しました:

Android:background="@Android:color/white"
Android:elevation="10dp"
83
John Slavick

もう1つ注意しておくべきことは、この行がマニフェストに含まれていると影が表示されないことです。

アンドロイド:hardwareAccelerated = "false"

提案されたものをすべて試しましたが、行を削除したときにしか機能しませんでした。行を持っていたのは、私のアプリが多数のビットマップイメージで動作し、それらが原因でアプリがクラッシュしたためです。

37
nada

ボタン要素に標高を追加する場合は、次の行を追加する必要があります。

Android:stateListAnimator="@null"

参照してください Android 5.0 Android:elevation表示機能はありますが、ボタン機能はありませんか。

15
user8102108

あなたが背景のないビューを持っているなら、この行はあなたを助けるでしょう

Android:outlineProvider="bounds"

あなたが背景を持つビューを持っているならば、この行はあなたを助けるでしょう

Android:outlineProvider="paddedBounds"
14
Deepak sharma

うーん、これを理解するために1時間だけ費やした。私の場合、私は背景を設定しましたが、それは色に設定されていました。これだけでは不十分です。ビューの背景を描画可能オブジェクトに設定する必要があります。

例えばこれに影はありません。

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="165dp"
    Android:background="@color/ight_grey"
    Android:elevation="20dp"
    Android:orientation="vertical"
    />

しかしこれは

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="165dp"
    Android:background="@drawable/selector_grey"
    Android:elevation="20dp"
    Android:orientation="vertical"
    />

編集:あなたが背景としてセレクタを使用している場合、あなたがコーナーを設定していない場合は影が プレビューウィンドウ に表示されませんが、それはデバイスに表示されます

例えばこれはプレビューに影がありません。

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <shape Android:shape="rectangle">
            <solid Android:color="@color/white" />
            <stroke
                Android:width="1dp"
                Android:color="@color/grey"/>
        </shape>
    </item>
</selector>

しかし、これはしません:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <shape Android:shape="rectangle">
            <solid Android:color="@color/white" />
            <corners Android:radius="1dp" />
            <stroke
                Android:width="1dp"
                Android:color="@color/grey"/>
        </shape>
    </item>
</selector>
11
odiggity

背景色を追加すると私は役に立ちました。

<CalendarView
    Android:layout_width="match_parent"
    Android:id="@+id/calendarView"
    Android:layout_alignParentTop="true"
    Android:layout_alignParentStart="true"
    Android:layout_height="wrap_content"
    Android:elevation="5dp"

    Android:background="@color/windowBackground"

    />
6
Tim Glenn

background="@color/***"background="#ff33**"がうまく動かないような時は、私はbackground_colorをdrawableに置き換えます、そしてそれはうまくいきます

3
ray liu

透明な背景にしたいのにAndroid:outlineProvider="bounds"がうまくいかない場合は、カスタムViewOutlineProviderを作成できます。

class TransparentOutlineProvider extends ViewOutlineProvider {

    @Override
    public void getOutline(View view, Outline outline) {
        ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
        Drawable background = view.getBackground();
        float outlineAlpha = background == null ? 0f : background.getAlpha()/255f;
        outline.setAlpha(outlineAlpha);
    }
}

そしてこのプロバイダをあなたの透明なビューに設定してください。

transparentView.setOutlineProvider(new TransparentOutlineProvider());

出所: https://code.google.com/p/Android/issues/detail?id=78248#c13

[編集] Drawable.getAlpha()のドキュメントは、Drawableがアルファをどのように脅かしているかに特有のものであると述べています。常に255が返される可能性があります。この場合は、手動でアルファを指定できます。

class TransparentOutlineProvider extends ViewOutlineProvider {

    private float mAlpha;

    public TransparentOutlineProvider(float alpha) {
        mAlpha = alpha;
    }

    @Override
    public void getOutline(View view, Outline outline) {
        ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
        outline.setAlpha(mAlpha);
    }
}

ビューの背景がデフォルトカラー#DDFF0000のStateListDrawableで、アルファDDx0/FFx0 == 0.86の場合

transparentView.setOutlineProvider(new TransparentOutlineProvider(0.86f));
3
wirdil

私のために働いたレイアウトにいくつかの背景色を与えるように:

    Android:background="@color/catskill_white"
    Android:layout_height="?attr/actionBarSize"
    Android:elevation="@dimen/dimen_5dp"
2
sudhakara

承認された答えに加えて、昇格が期待どおりに機能しない可能性があるため、もう1つの理由があります。

電話機のブルーライトフィルタ機能がオンの場合

私の装置では標高が完全に歪んで耐え難いように見えたとき、私はこの問題に直面していました。しかし、標高はプレビューで大丈夫だった。電話機のブルーライトフィルタをオフにすると、問題は解決しました。

設定後もそう

Android:outlineProvider="bounds"

標高が正しく機能していない場合は、携帯電話の色設定を変更することができます。

1
Hemang Kumar

それでも標高が表示されない場合

    Android:hardwareAccelerated="true" 

これは間違いなくあなたを助けます。

1
Rohit Lalwani

私の場合、これはカスタムの親コンポーネントがレンダリングレイヤタイプを "Software"に設定したことが原因です。

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

この行を削除するとうまくいきます。それとも、なぜこれがそもそもあるのかを評価する必要があります。私の場合は、Honeycombをサポートすることでした。これは、私のプロジェクトの現在の最小SDKの裏にあります。

0
ErrricP

私はあなたの問題はあなたがその親を満たす相対的なレイアウトにelevation要素を適用したという事実から生じると信じています。その親は、それ自身の描画キャンバス内のすべての子ビューを切り取ります(そして、子の影を処理するビューです)。ビューxml(ルートタグ)の一番上のRelativeLayoutにelevationプロパティを適用することでこれを修正できます。

0
FluffyC4n't

私の場合はフォントが問題でした。

1)fontFamilyがなければAndroid:backgroundを何らかの値に設定する必要がありました。

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="44dp"
    Android:background="@Android:color/white"
    Android:elevation="3dp"
    Android:gravity="center"
    Android:text="@string/fr_etalons_your_tickets"
    Android:textAllCaps="true"
    Android:textColor="@color/blue_4" />

2)fontFamilyAndroid:outlineProvider="bounds"設定を追加しなければなりませんでした:

<TextView
    Android:fontFamily="@font/gilroy_bold"
    Android:layout_width="match_parent"
    Android:layout_height="44dp"
    Android:background="@Android:color/white"
    Android:elevation="3dp"
    Android:gravity="center"
    Android:outlineProvider="bounds"
    Android:text="@string/fr_etalons_your_tickets"
    Android:textAllCaps="true"
    Android:textColor="@color/blue_4" />
0
soshial

私は親のレイアウトにclipChildren="false"を設定することでいくらか運が良かった。

0
Kavi

私はそれに取り組んでしばらく時間を費やし、そして最後に、背景が暗い時には影が見えないことに気付きました。

0
Efi G