it-swarm.com.de

Android "Elevation" zeigt keinen Schatten

Ich habe eine ListView und mit jedem Listenelement möchte ich, dass darunter ein Schatten angezeigt wird. Ich benutze die neue Höhenfunktion von Android Lollipop, um ein Z in der Ansicht festzulegen, das ich einen Schatten werfen möchte, und mache dies bereits effektiv mit der ActionBar (technisch eine Toolbar in Lollipop). Ich benutze Lollipop's Elevation, aber aus irgendeinem Grund wird unter den Listenelementen kein Schatten angezeigt. So wird das Layout jedes Listenelements eingerichtet:

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

Hier wird jedoch das Listenelement ohne Schatten angezeigt: enter image description here

Ich habe auch folgendes versucht, ohne Erfolg:

  1. Legen Sie die Höhe auf ImageView und TextViews selbst anstatt auf das übergeordnete Layout fest.
  2. Wendet einen Hintergrund auf die ImageView an.
  3. Verwendet TranslationZ anstelle von Elevation.
213
AggieDev

Ich habe ein bisschen mit Schatten auf Lollipop herumgespielt und das ist, was ich gefunden habe: 

  1. Es scheint, dass die Grenzen eines Elternteils ViewGroup aus irgendeinem Grund den Schatten seiner Kinder abschneiden; und
  2. mit Android:elevation gesetzte Schatten werden durch die Grenzen von View abgeschnitten, nicht durch die Ränder, die über den Rand hinausragen.
  3. der richtige Weg, um eine untergeordnete Ansicht zum Anzeigen von Schatten zu erhalten, besteht darin, die Auffüllung des übergeordneten Elements und Android:clipToPadding="false" für dieses übergeordnete Element festzulegen.

Hier ist mein Vorschlag an Sie, basierend auf dem, was ich weiß:

  1. Stellen Sie Ihre oberste Ebene RelativeLayout so ein, dass die Auffüllung den Rändern entspricht, die Sie für das relative Layout festgelegt haben, das Sie Schatten anzeigen möchten.
  2. setze Android:clipToPadding="false" auf dasselbe RelativeLayout;
  3. Entfernen Sie den Rand von RelativeLayout, für den auch die Höhe eingestellt ist.
  4. [BEARBEITEN] Sie müssen möglicherweise auch eine nicht transparente Hintergrundfarbe für das untergeordnete Layout festlegen, für die eine Erhöhung erforderlich ist.

Am Ende des Tages sollte Ihr relatives Layout auf oberster Ebene folgendermaßen aussehen:

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

Das relative Innenlayout sollte folgendermaßen aussehen:

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

Wenn Sie eine Ansicht ohne Hintergrund haben, hilft Ihnen diese Zeile

Android:outlineProvider="bounds"

Standardmäßig wird der Schatten durch den Hintergrund der Ansicht bestimmt. Wenn also kein Hintergrund vorhanden ist, wird auch kein Schatten angezeigt. 

240

Anscheinend können Sie nicht einfach eine Höhe in einer Ansicht festlegen und anzeigen lassen. Sie müssen auch einen Hintergrund angeben.

Die folgenden Zeilen, die zu meinem LinearLayout hinzugefügt wurden, zeigten schließlich einen Schatten:

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

eine andere Sache, die Sie beachten sollten, Schatten werden nicht angezeigt, wenn Sie diese Zeile im Manifest haben:

Android: hardwareAccelerated = "false"

Ich habe alle vorgeschlagenen Dinge ausprobiert, aber es funktionierte nur für mich, als ich die Zeile entfernte. Der Grund für die Zeile war, dass meine App mit einer Reihe von Bitmap-Bildern arbeitet und die App zum Absturz brachte.

34
nada

Wenn Sie einem Schaltflächenelement eine Höhe hinzufügen, müssen Sie die folgende Zeile hinzufügen:

Android:stateListAnimator="@null"

Siehe Android 5.0 Android: Elevation funktioniert für View, aber nicht Button?

16
user8102108

Ich habe nur eine Stunde damit verbracht, das herauszufinden. In meinem Fall hatte ich einen Hintergrund, der jedoch auf eine Farbe gesetzt wurde. Dies reicht nicht aus, Sie müssen den Hintergrund der Ansicht auf ein Zeichenobjekt setzen. 

z.B. Das wird keinen Schatten haben: 

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

aber das wird

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

EDIT: Habe auch festgestellt, dass wenn Sie einen Selektor als Hintergrund verwenden, wenn die Ecke nicht gesetzt ist, der Schatten nicht im Vorschaufenster angezeigt wird, sondern im Gerät

z.B. Dies hat keinen Schatten in der Vorschau:

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

aber das tut:

<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

Wenn Sie eine Ansicht ohne Hintergrund haben, hilft Ihnen diese Zeile

Android:outlineProvider="bounds"

Wenn Sie eine Ansicht mit Hintergrund haben, hilft Ihnen diese Zeile

Android:outlineProvider="paddedBounds"
11
Deepak sharma

Das Hinzufügen von Hintergrundfarbe hat mir geholfen.

<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

Manchmal funktioniert background="@color/***" oder background="#ff33**" nicht, ersetze ich background_color durch drawable, dann funktioniert es

3
ray liu

Wenn Sie einen transparenten Hintergrund haben möchten und Android:outlineProvider="bounds" für Sie nicht funktioniert, können Sie einen benutzerdefinierten ViewOutlineProvider erstellen:

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);
    }
}

Stellen Sie diesen Anbieter auf Ihre transparente Sicht ein:

transparentView.setOutlineProvider(new TransparentOutlineProvider());

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

[EDIT] Die Dokumentation von Drawable.getAlpha () sagt, dass es spezifisch ist, wie Drawable das Alpha bedroht. Es ist möglich, dass immer 255 zurückgegeben wird ..__ In diesem Fall können Sie das Alpha manuell angeben:

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);
    }
}

Wenn Ihr Ansichtshintergrund eine StateListDrawable mit der Standardfarbe # DDFF0000 ist, die mit Alpha DDx0/FFx0 == 0,86 ist

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

geben Sie dem für mich erarbeiteten Layout eine Hintergrundfarbe.

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

Neben der akzeptierten Antwort gibt es noch einen weiteren Grund, weshalb die Höhenlage möglicherweise nicht wie erwartet funktioniert.

Wenn die Bluelight-Filterfunktion des Telefons aktiviert ist

Ich war mit diesem Problem konfrontiert, als die Erhebung auf meinem Gerät völlig verzerrt und unerträglich schien. Aber die Höhe war in der Vorschau gut. Wenn Sie den Bluelight-Filter auf dem Telefon ausschalten, wurde das Problem behoben.

Also auch nach dem Einstellen

Android:outlineProvider="bounds"

Die Höhe funktioniert nicht richtig. Dann können Sie versuchen, die Farbeinstellungen des Telefons zu basteln.

1
Hemang Kumar

Wenn die Höhe immer noch nicht angezeigt wird, versuchen Sie es

    Android:hardwareAccelerated="true" 

das wird dir definitiv helfen.

1
Rohit Lalwani

In meinem Fall wurde dies durch eine benutzerdefinierte übergeordnete Komponente verursacht, die als Rendering-Layer "Software" festgelegt hat:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Das Entfernen dieser Zeile hat den Trick getan. Oder natürlich müssen Sie beurteilen, warum dies überhaupt da ist. In meinem Fall sollte Honeycomb unterstützt werden, was für mein Projekt weit hinter dem aktuellen Mindest-SDK liegt.

0
ErrricP

Ich glaube, Ihr Problem rührt von der Tatsache her, dass Sie das Element Elevation auf ein relatives Layout angewendet haben, das das übergeordnete Element ausfüllt. Das übergeordnete Element schneidet alle untergeordneten Ansichten in seinem eigenen Zeichenbereich ab (und ist die Ansicht, die den Schatten des untergeordneten Elements behandelt). Sie können dies beheben, indem Sie auf die oberste RelativeLayout in Ihrer Ansichts-XML (das Root-Tag) eine Elevation-Eigenschaft anwenden.

0
FluffyC4n't

In meinem Fall waren Schriftarten das Problem. 

1) Ohne fontFamily musste ich Android:background auf einen Wert setzen.

<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) mit fontFamily musste ich die Android:outlineProvider="bounds"-Einstellung hinzufügen:

<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

Ich hatte etwas Glück mit der Einstellung von clipChildren="false" im übergeordneten Layout.

0
Kavi

Ich habe einige Zeit damit verbracht, daran zu arbeiten und schließlich wurde mir klar, dass Schatten bei dunklem Hintergrund nicht sichtbar ist 

0
Efi G