Mam ListView i przy każdym elemencie listy chcę, aby wyświetlał cień pod nim. Korzystam z nowej funkcji elewacji Androida Lollipop, aby ustawić Z w widoku, który chcę rzucić cień, i już robię to skutecznie z ActionBar (technicznie pasek narzędzi w Lollipop). Korzystam z elewacji Lollipopa, ale z jakiegoś powodu nie pokazuje on cienia pod elementami listy. Oto jak układ każdego elementu listy jest skonfigurowany:
<?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>
Oto, jak pokazuje element listy bez cienia:
Próbowałem również następujące bezskutecznie:
- Ustaw elewację do ImageView i TextViews zamiast układu macierzystego.
- Zastosował tło do ImageView.
- Używane TranslationZ zamiast elewacji.
android
material-design
shadow
android-elevation
AggieDev
źródło
źródło
Odpowiedzi:
Przez jakiś czas bawiłem się cieniami na Lollipop i oto, co znalazłem:
ViewGroup
granice rodzica z jakiegoś powodu odcinają cień jego dzieci; iandroid:elevation
są odcięte przezView
granice, a nie granice rozciągnięte przez margines;android:clipToPadding="false"
na tym rodzicu.Oto moja propozycja dla ciebie na podstawie tego, co wiem:
RelativeLayout
aby wypełnienie było równe marginesom ustawionym dla względnego układu, który chcesz wyświetlać w cieniu;android:clipToPadding="false"
na to samoRelativeLayout
;RelativeLayout
który ma również ustawiony poziom;Na koniec Twój względny układ najwyższego poziomu powinien wyglądać następująco:
Wewnętrzny układ względny powinien wyglądać następująco:
źródło
Jeśli masz widok bez tła, ta linia ci pomoże
Domyślnie cień jest określany na podstawie tła widoku, więc jeśli nie ma tła, nie będzie również cienia.
źródło
<solid>
.none
. Dzięki!Najwyraźniej nie można po prostu ustawić wysokości w Widoku i sprawić, by się pojawiła. Musisz także określić tło.
Następujące linie dodane do mojego LinearLayout w końcu pokazały cień:
źródło
jeszcze jedna rzecz, o której powinieneś wiedzieć, cienie nie pokażą się, jeśli w manifeście masz tę linię:
android: hardwareAccelerated = "false"
Próbowałem wszystkich sugerowanych rzeczy, ale działało to tylko dla mnie, gdy usunąłem linię. Powodem, dla którego ją miałem, było to, że moja aplikacja działa z wieloma obrazami bitmapowymi i powodowały awarię aplikacji.
źródło
android:clipToPadding="false"
tego rozwiązania.Jeśli masz widok bez tła, ta linia ci pomoże
Jeśli masz widok z tłem, ta linia ci pomoże
źródło
android:outlineProvider="paddedBounds"
ta linia działała dla mnie. Ustawiam Selector Drawable.Jeśli dodajesz rzędną do elementu przycisku, musisz dodać następujący wiersz:
Zobacz Androida 5.0 na Androida: elewacja działa w widoku, ale nie w przycisku?
źródło
Ugh, spędziłem godzinę próbując to rozgryźć. W moim przypadku miałem zestaw tła, jednak był on ustawiony w kolorze. To nie wystarczy, musisz ustawić tło widoku na rysowalne.
np. To nie będzie miało cienia:
ale to będzie
EDYCJA: Odkryłem również, że jeśli używasz selektora jako tła, jeśli nie masz ustawionego rogu, cień nie pojawi się w oknie podglądu, ale pojawi się na urządzeniu
np. To nie ma cienia w podglądzie:
ale to:
źródło
Dodanie koloru tła pomogło mi.
źródło
Czasami jak
background="@color/***"
lubbackground="#ff33**"
nie działa, zamieniam nabackground_color
drawable, a potem działaźródło
Jeśli nadal nie pokazuje wysokości, spróbuj
to na pewno ci pomoże.
źródło
Jeśli chcesz mieć przezroczyste tło i
android:outlineProvider="bounds"
nie działa dla Ciebie, możesz utworzyć niestandardowy ViewOutlineProvider:I ustaw tego dostawcę na przejrzysty widok:
Źródła: https://code.google.com/p/android/issues/detail?id=78248#c13
[EDYCJA] Dokumentacja Drawable.getAlpha () mówi, że jest specyficzna dla tego, w jaki sposób Drawable zagraża alfa. Możliwe, że zawsze zwróci 255. W takim przypadku możesz podać alfabet ręcznie:
Jeśli tło widoku to StateListDrawable z domyślnym kolorem # DDFF0000, który ma alfa DDx0 / FFx0 == 0,86
źródło
dodaj kolor tła układowi, który dla mnie działał:
źródło
Miałem trochę szczęścia z ustawieniem
clipChildren="false"
układu rodzica.źródło
Spędziłem trochę czasu nad tym pracując i w końcu zdałem sobie sprawę, że gdy tło jest ciemne, cień nie jest widoczny
źródło
Dodając do zaakceptowanej odpowiedzi, istnieje jeszcze jeden powód, dla którego podniesienie może nie działać zgodnie z oczekiwaniami, jeśli funkcja filtru Bluelight w telefonie jest WŁĄCZONA.
Napotkałem ten problem, gdy w moim urządzeniu elewacja wydawała się całkowicie zniekształcona i nie do zniesienia. Ale w podglądzie wysokość była w porządku. Wyłączenie filtra Bluelight na telefonie rozwiązało problem.
Więc nawet po ustawieniu
Wysokość nie działa poprawnie, możesz więc majstrować przy ustawieniach kolorów telefonu.
źródło
Uważam, że twój problem wynika z faktu, że zastosowałeś element elewacji do układu względnego, który wypełnia jego element nadrzędny. Jego rodzic przycina wszystkie widoki potomne we własnym obszarze roboczym rysunku (i jest widokiem, który obsługuje cień dziecka). Możesz to naprawić, stosując właściwość elewacji do najwyższego
RelativeLayout
w swoim widoku xml (znacznik root).źródło
W moim przypadku problemem były czcionki.
1) Bez
fontFamily
musiałem ustawićandroid:background
jakąś wartość.2) z
fontFamily
musiałem dodaćandroid:outlineProvider="bounds"
ustawienie:źródło
W moim przypadku było to spowodowane niestandardowym komponentem nadrzędnym ustawiającym typ warstwy renderującej na „Oprogramowanie”:
Usunięcie tej linii zrobiło lewę. Lub oczywiście musisz ocenić, dlaczego tak się dzieje. W moim przypadku chodziło o obsługę programu Honeycomb, który jest znacznie poniżej obecnego minimalnego zestawu SDK dla mojego projektu.
źródło
Sprawdź także, czy nie zmieniasz alfa w tym widoku. Badam problem, gdy zmieniam alfa w niektórych widokach z elewacją. Po prostu tracą wysokość, gdy zmienia się alfa i wraca do 1f.
źródło