Chciałbym utworzyć kształt podobny do poniższego obrazu:
Zwróć uwagę na górne pół gradienty od koloru 1 do koloru 2, ale jest dolna połowa, która przechodzi od koloru 3 do koloru 4. Wiem, jak utworzyć kształt za pomocą pojedynczego gradientu, ale nie jestem pewien, jak podzielić kształt na dwie połówki i ułóż 1 kształt z 2 różnymi gradientami.
Jakieś pomysły?
Odpowiedzi:
Wydaje mi się, że nie da się tego zrobić w XML (przynajmniej nie w Androidzie), ale znalazłem zamieszczone tutaj dobre rozwiązanie , które wygląda na to, że byłoby to bardzo pomocne!
Zasadniczo tablica int umożliwia wybranie wielu przystanków koloru, a poniższa tablica zmiennoprzecinkowa określa, gdzie te przystanki się znajdują (od 0 do 1). Możesz wtedy, jak wspomniano, po prostu użyć tego jako standardowego Drawable.
Edycja: Oto, jak możesz to wykorzystać w swoim scenariuszu. Powiedzmy, że masz Button zdefiniowany w XML w następujący sposób:
Następnie umieściłbyś coś takiego w swojej metodzie onCreate ():
Nie mogę tego w tej chwili przetestować, to jest kod z mojej głowy, ale w zasadzie po prostu zastąp lub dodaj stopery dla potrzebnych kolorów. Zasadniczo, w moim przykładzie, zacząłbyś od jasnozielonego, przechodzącego do białego nieco przed środkiem (aby uzyskać blaknięcie zamiast ostrego przejścia), zanikającego od białego do średniego zielonego między 45% a 55%, a następnie zanikającego od średnio zielony do ciemnozielonego od 55% do końca. To może nie wyglądać dokładnie tak, jak twój kształt (w tej chwili nie mam możliwości przetestowania tych kolorów), ale możesz to zmodyfikować, aby powtórzyć swój przykład.
Edycja: Również
0, 0, 0, theButton.getHeight()
odnosi się do współrzędnych x0, y0, x1, y1 gradientu. Zasadniczo zaczyna się od x = 0 (lewa strona), y = 0 (na górze) i rozciąga się do x = 0 (chcemy mieć pionowy gradient, więc kąt od lewej do prawej nie jest konieczny), y = wysokość przycisku. Tak więc gradient przebiega pod kątem 90 stopni od góry przycisku do dołu przycisku.Edycja: OK, więc mam jeszcze jeden pomysł, który działa, haha. Obecnie działa w języku XML, ale powinno być możliwe również w przypadku kształtów w Javie. To trochę skomplikowane i wyobrażam sobie, że istnieje sposób na uproszczenie go do jednego kształtu, ale na razie mam to:
green_horizontal_gradient.xml
half_overlay.xml
layer_list.xml
test.xml
W porządku, więc w zasadzie utworzyłem gradient kształtu w XML dla poziomego zielonego gradientu, ustawiony pod kątem 0 stopni, przechodząc od lewego zielonego koloru górnego obszaru do prawego zielonego koloru. Następnie wykonałem prostokąt kształtu z półprzezroczystą szarością. Jestem prawie pewien, że można to wstawić do XML listy warstw, aby uniknąć tego dodatkowego pliku, ale nie jestem pewien, jak. Ale w porządku, w takim razie w pliku XML lista_warstw pojawia się rodzaj hackerskiej części. Umieszczam zielony gradient jako dolną warstwę, a następnie połowę nakładam jako drugą warstwę, przesuniętą od góry o 50 dp. Oczywiście chciałbyś, aby ta liczba zawsze była o połowę mniejsza od rozmiaru twojego widoku, a nie stałe 50 dp. Nie sądzę jednak, aby można było używać procentów. Stamtąd właśnie wstawiłem TextView do mojego układu test.xml, używając pliku layer_list.xml jako mojego tła.
Tada!
Jeszcze jedna edycja : zdałem sobie sprawę, że możesz po prostu osadzić kształty na liście warstw jako elementy, co oznacza, że nie potrzebujesz już 3 oddzielnych plików XML! Możesz osiągnąć ten sam efekt łącząc je w następujący sposób:
layer_list.xml
W ten sposób możesz ułożyć dowolną liczbę elementów! Mogę spróbować się pobawić i zobaczyć, czy uda mi się uzyskać bardziej wszechstronny wynik dzięki Javie.
Myślę, że to ostatnia edycja ... : OK, więc zdecydowanie możesz naprawić pozycjonowanie za pomocą Java, jak poniżej:
Jednak! Prowadzi to do kolejnego irytującego problemu polegającego na tym, że nie można zmierzyć TextView, dopóki nie zostanie narysowany. Nie jestem jeszcze do końca pewien, jak możesz to osiągnąć ... ale ręczne wstawienie numeru do topInset działa.
Skłamałem, jeszcze jedna edycja
OK, dowiedziałem się, jak ręcznie zaktualizować tę warstwę do rysowania, aby pasowała do wysokości kontenera, pełny opis można znaleźć tutaj . Ten kod powinien znaleźć się w Twojej metodzie onCreate ():
I gotowe! Uff! :)
źródło
Kształty gradientu można nakładać na warstwy w pliku XML za pomocą listy warstw. Wyobraź sobie przycisk ze stanem domyślnym jak poniżej, w którym drugi element jest półprzezroczysty. Dodaje coś w rodzaju winietowania. (Proszę wybaczyć niestandardowe kolory).
źródło
MOŻESZ to zrobić używając tylko kształtów XML - po prostu użyj listy warstw ORAZ dopełnienia ujemnego w następujący sposób:
źródło
Wypróbuj tę metodę, a będziesz mógł zrobić wszystko, co chcesz.
Jest jak stos, więc uważaj, który przedmiot jest pierwszy lub ostatni.
źródło
Czy próbowałeś nałożyć jeden gradient z prawie przezroczystym kryciem dla podświetlenia na inny obraz z nieprzezroczystym kryciem dla zielonego gradientu?
źródło