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:
Ich habe auch folgendes versucht, ohne Erfolg:
Ich habe ein bisschen mit Schatten auf Lollipop herumgespielt und das ist, was ich gefunden habe:
ViewGroup
aus irgendeinem Grund den Schatten seiner Kinder abschneiden; undAndroid:elevation
gesetzte Schatten werden durch die Grenzen von View
abgeschnitten, nicht durch die Ränder, die über den Rand hinausragen.Android:clipToPadding="false"
für dieses übergeordnete Element festzulegen.Hier ist mein Vorschlag an Sie, basierend auf dem, was ich weiß:
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.Android:clipToPadding="false"
auf dasselbe RelativeLayout
;RelativeLayout
, für den auch die Höhe eingestellt 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"
>
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.
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"
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.
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?
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>
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"
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"
/>
Manchmal funktioniert background="@color/***"
oder background="#ff33**"
nicht, ersetze ich background_color
durch drawable, dann funktioniert es
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));
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"
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.
Wenn die Höhe immer noch nicht angezeigt wird, versuchen Sie es
Android:hardwareAccelerated="true"
das wird dir definitiv helfen.
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.
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.
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" />
Ich hatte etwas Glück mit der Einstellung von clipChildren="false"
im übergeordneten Layout.
Ich habe einige Zeit damit verbracht, daran zu arbeiten und schließlich wurde mir klar, dass Schatten bei dunklem Hintergrund nicht sichtbar ist