Czy można dodać cień do niestandardowego kształtu w systemie Android? Po przejrzeniu dokumentacji widzę tylko sposób na zastosowanie cienia tekstu.
Próbowałem tego bez powodzenia:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#90ffffff"/>
<corners android:radius="12dp" />
<item name="android:shadowColor">#000000</item>
<item name="android:shadowRadius">5</item>
<item name="android:shadowDy">3</item>
</shape>
android
android-layout
mdunkle
źródło
źródło
<!-- Bottom 2dp Shadow -->
, nie widzę żadnego2
w twoim kodzie ... ???Oto jak to robię:
Kod poniżej dla jednego przycisku STAN:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- "background shadow" --> <item> <shape android:shape="rectangle" > <solid android:color="#000000" /> <corners android:radius="15dp" /> </shape> </item> <!-- background color --> <item android:bottom="3px" android:left="3px" android:right="3px" android:top="3px"> <shape android:shape="rectangle" > <solid android:color="#cc2b2b" /> <corners android:radius="8dp" /> </shape> </item> <!-- over left shadow --> <item> <shape android:shape="rectangle" > <gradient android:angle="180" android:centerColor="#00FF0000" android:centerX="0.9" android:endColor="#99000000" android:startColor="#00FF0000" /> <corners android:radius="8dp" /> </shape> </item> <!-- over right shadow --> <item> <shape android:shape="rectangle" > <gradient android:angle="360" android:centerColor="#00FF0000" android:centerX="0.9" android:endColor="#99000000" android:startColor="#00FF0000" /> <corners android:radius="8dp" /> </shape> </item> <!-- over top shadow --> <item> <shape android:shape="rectangle" > <gradient android:angle="-90" android:centerColor="#00FF0000" android:centerY="0.9" android:endColor="#00FF0000" android:startColor="#99000000" android:type="linear" /> <corners android:radius="8dp" /> </shape> </item> <!-- over bottom shadow --> <item> <shape android:shape="rectangle" > <gradient android:angle="90" android:centerColor="#00FF0000" android:centerY="0.9" android:endColor="#00FF0000" android:startColor="#99000000" android:type="linear" /> <corners android:radius="8dp" /> </shape> </item> </layer-list>
W takim razie powinieneś mieć selektor z różnymi wersjami przycisku, coś takiego:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_button_red_pressed" android:state_pressed="true"/> <!-- pressed --> <item android:drawable="@drawable/ic_button_red_selected" android:state_focused="true"/> <!-- focused --> <item android:drawable="@drawable/ic_button_red_selected" android:state_selected="true"/> <!-- selected --> <item android:drawable="@drawable/ic_button_red_default"/> <!-- default --> </selector>
mam nadzieję, że to pomoże ci… powodzenia
źródło
To jest moja wersja cienia. Ja jechałem na mglisty cień całego kształtu i stosować tę odpowiedź przez Joakim Lundborg jako mojego punktu wyjściowego. Zmieniłem, aby dodać rogi do wszystkich elementów cienia i zwiększyć promień narożnika dla każdego kolejnego elementu cienia. Oto więc
xml
:<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Drop Shadow Stack --> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#02000000" /> <corners android:radius="8dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#05000000" /> <corners android:radius="7dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#10000000" /> <corners android:radius="6dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#15000000" /> <corners android:radius="5dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#20000000" /> <corners android:radius="4dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#25000000" /> <corners android:radius="3dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <solid android:color="#30000000" /> <corners android:radius="3dp" /> </shape> </item> <!-- Background --> <item> <shape> <solid android:color="#0099CC" /> <corners android:radius="3dp" /> </shape> </item> </layer-list>
źródło
Myślę, że ta metoda daje bardzo dobre wyniki:
<!-- Drop Shadow Stack --> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#00CCCCCC"/> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#10CCCCCC"/> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#20CCCCCC"/> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#30CCCCCC"/> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp"/> <solid android:color="#50CCCCCC"/> </shape> </item> <item> <shape android:shape="rectangle"> <stroke android:color="#CCC" android:width="1dp"/> <solid android:color="#FFF" /> <corners android:radius="2dp" /> </shape> </item>
źródło
U mnie zadziałało: Po prostu zapisz jako custom_shape.xml.
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- "shadow" --> <item> <shape android:shape="rectangle" > <solid android:color="#000000"/> <corners android:radius="12dp" /> </shape> </item> <item android:bottom="3px"> <shape android:shape="rectangle"> <solid android:color="#90ffffff"/> <corners android:radius="12dp" /> </shape> </item> </layer-list>
źródło
Stare pytanie, ale opcja Elevation, dostępna w Material Design, zapewnia teraz cień dla wszystkich widoków.
<TextView android:id="@+id/myview" ... android:elevation="2dp" android:background="@drawable/myrect" />
Zobacz dokumentację na https://developer.android.com/training/material/shadows-clipping.html
źródło
ImageButton
zamiastImageView
plusaButton' because it allows a
ImageButton` pozwala zarówno na an, jakandroid:background
iandroid:src
. Dlatego udało mi się sprecyzowaćandroid:elevation
tylko raz i uniknąć „efektu piramidy Inków”, który opisałem w moim ostatnim komentarzu.Sugerowałbym małe ulepszenie do rozwiązania Bruce'a, które polega na zapobieganiu rysowaniu tego samego kształtu jeden na drugim i po prostu używaniu kreski zamiast bryły. Wyglądałoby to tak:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Drop Shadow Stack --> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <stroke android:color="#02000000" android:width="1dp" /> <corners android:radius="8dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <stroke android:color="#05000000" android:width="1dp" /> <corners android:radius="7dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <stroke android:color="#10000000" android:width="1dp" /> <corners android:radius="6dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <stroke android:color="#15000000" android:width="1dp" /> <corners android:radius="5dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <stroke android:color="#20000000" android:width="1dp" /> <corners android:radius="4dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <stroke android:color="#25000000" android:width="1dp" /> <corners android:radius="3dp" /> </shape> </item> <item> <shape> <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" /> <stroke android:color="#30000000" android:width="1dp" /> <corners android:radius="3dp" /> </shape> </item> <!-- Background --> <item> <shape> <solid android:color="#FFF" /> <corners android:radius="3dp" /> </shape> </item> </layer-list>
Na koniec chciałem wskazać osobom, które chciałyby cienia w określonym kierunku, że wszystko, co musisz zrobić, to ustawić górę, dół, lewo lub prawo na 0dp (dla linii ciągłej) lub -1dp (za nic)
źródło
Jeśli nie masz nic przeciwko zrobieniu niestandardowego rysunku za pomocą interfejsu API Canvas, zapoznaj się z tą odpowiedzią na temat cieni . Oto pytanie uzupełniające do tego, które rozwiązuje problem w oryginale.
źródło
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@android:color/white" > </solid> <stroke android:width="1dp" android:color="@color/LightGrey" > </stroke> <padding android:bottom="5dp" android:left="2dp" android:right="2dp" android:top="5dp" > </padding> <corners android:bottomLeftRadius="20dp" android:bottomRightRadius="20dp" android:radius="12dp" android:topLeftRadius="20dp" android:topRightRadius="20dp" /> <gradient android:angle="90" android:centerColor="@android:color/white" android:centerY="0.2" android:endColor="#99e0e0e0" android:startColor="@android:color/white" android:type="linear" /> </shape>
źródło
Myślę, że ta wartość cienia jest dobra w większości przypadków:
<solid android:color="#20000000" />
źródło
To pytanie może być stare, ale dla każdego, kto w przyszłości szuka prostego sposobu na uzyskanie złożonych efektów cieni, zajrzyj do mojej biblioteki tutaj https://github.com/BluRe-CN/ComplexView
Korzystając z biblioteki, możesz zmieniać kolory cieni, dostosowywać krawędzie i wiele więcej. Oto przykład, jak osiągnąć to, czego szukasz.
<com.blure.complexview.ComplexView android:layout_width="400dp" android:layout_height="600dp" app:radius="10dp" app:shadow="true" app:shadowSpread="2"> <com.blure.complexview.ComplexView android:layout_width="match_parent" android:layout_height="match_parent" app:color="#fdfcfc" app:radius="10dp" /> </com.blure.complexview.ComplexView>
Aby zmienić kolor cienia, użyj app: shadowColor = "twój kod koloru".
źródło
9 łatka na ratunek, ładny cień można łatwo uzyskać, szczególnie dzięki temu niesamowitemu narzędziu -
Generator cieni dla systemu Android z 9 poprawkami
PS: jeśli projekt nie będzie mógł się skompilować, będziesz musiał trochę przesunąć czarne linie w edytorze Android Studio
źródło
jeśli potrzebujesz cienia w linii prostej (jak na dole paska narzędzi), możesz również użyć gradientu XML:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:type="linear" android:angle="-90" android:startColor="#19000000" <!-- black transparent --> android:endColor="#00000000" /> <!-- full transparent --> </shape>
mam nadzieję, że to komuś pomoże
źródło