Próbuję użyć a VectorDrawable
in a LayerList
bez skalowania wektora. Na przykład:
<layer-list>
<item android:drawable="@color/grid_item_activated"/>
<item android:gravity="center" android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>
ic_check_white_48dp
Identyfikator do rysowania zdefiniowany jako:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>
Pożądanym efektem jest wyśrodkowanie ikony zaznaczenia na warstwie, którą można rysować, bez skalowania. Problem polega na tym, że powyższa lista warstw powoduje przeskalowanie ikony zaznaczenia, aby dopasować ją do rozmiaru warstwy.
I można wytworzyć pożądany efekt, jeśli wymienić rozciągliwej wektor z PNG dla każdej gęstości i modyfikowania warstwy-lista w następujący sposób:
<layer-list>
<item android:drawable="@color/grid_item_activated"/>
<item>
<bitmap android:gravity="center" android:src="@drawable/ic_check_white_48dp"/>
</item>
</layer-list>
Czy jest jakiś sposób, aby to zrobić za pomocą VectorDrawable
?
Odpowiedzi:
Napotkałem ten sam problem, próbując wyśrodkować wektory drawables na liście warstwowej.
Mam obejście, to nie jest dokładnie to samo, ale działa, musisz ustawić rozmiar dla całego elementu do rysowania i dodać wypełnienie do elementu wektorowego:
Rozmiar powyższego kształtu określa rozmiar całego rysowanego kształtu, w tym przykładzie 120 dp, wypełnienie drugiego elementu, w tym przykładzie 24 dp, wyśrodkowuje obraz wektorowy.
To nie to samo, co
gravity="center"
używanie wektorów w API 21 i 22, ale jego działający sposób.źródło
gravity="center"
API 21 i 22.windowBackground
. Jawne rozmiary nie działają w tym przypadku. I to też nie działa, jeśli umieszczę listę warstw na innej liście warstw.Zmagałem się z tym samym problemem. Jedynym sposobem, w jaki udało mi się to naprawić i uniknąć możliwości skalowania w górę, było ustawienie rozmiaru do rysowania i użycie grawitacji do wyrównania go:
Mam nadzieję, że to pomoże!
źródło
width
atrybut nie jest dostępny na tych poziomach API. W API 23 nie są one potrzebne, ponieważ błąd został naprawiony, a plik do rysowania nie jest już rozciągany.Edytowane rozwiązanie, które sprawi, że Twój SplashScreen będzie wyglądał świetnie na wszystkich interfejsach API, w tym API21 do API23
Przede wszystkim przeczytaj ten artykuł i postępuj zgodnie z DOBRYM sposobem tworzenia ekranu powitalnego.
Jeśli Twoje logo jest zniekształcone lub nie pasuje, a Twoim celem jest tylko APIs24 +, możesz po prostu zmniejszyć rozmiar swojego wektora do rysowania bezpośrednio w jego pliku xml:
w powyższym kodzie przeskaluję rysunek, który narysowałem na płótnie 640x640, do rozmiaru 240x240. potem po prostu umieściłem go na moim ekranie powitalnym do rysowania w ten sposób i działa świetnie:
mój kod faktycznie rysuje tylko trójkąt na obrazku u dołu, ale tutaj widzisz, co możesz dzięki temu osiągnąć. Rozdzielczość jest w końcu świetna w przeciwieństwie do pikselowanych krawędzi, które uzyskiwałem podczas korzystania z bitmapy. więc używaj wektora, który można narysować na wszelkie sposoby (istnieje strona o nazwie vectr, której użyłem do stworzenia mojego bez konieczności pobierania specjalistycznego oprogramowania).
EDYTUJ, aby działał również na API21-22-23
Chociaż powyższe rozwiązanie działa na urządzeniach z API24 +, po zainstalowaniu mojej aplikacji na urządzeniu z API22 byłem bardzo rozczarowany. Zauważyłem, że ekran powitalny ponownie próbował wypełnić cały widok i wyglądał jak gówno. Po wyrywaniu brwi przez pół dnia w końcu brutalnie wymusiłem rozwiązanie siłą woli.
musisz utworzyć drugi plik nazwany dokładnie tak jak splashscreen xml (powiedzmy splash_screen.xml) i umieścić go w 2 folderach o nazwach drawable-v22 i drawable-v21, które utworzysz w folderze res / (aby je zobaczyć, musisz zmienić widok projektu z Androida na Projekt). Służy to do poinformowania telefonu, aby przekierował do plików umieszczonych w tych folderach, gdy odpowiednie urządzenie uruchamia interfejs API odpowiadający sufiksowi -vXX w folderze do rysowania, zobacz ten link . umieść następujący kod na liście warstw pliku splash_screen.xml, który tworzysz w tych folderach:
Z jakiegoś powodu w przypadku tych interfejsów API musisz owinąć twoją rysowaną mapę bitową, aby działała, a ostateczny wynik wygląda tak samo. Problem polega na tym, że musisz użyć podejścia z dodatkowymi folderami do rysowania, ponieważ druga wersja pliku splash_screen.xml spowoduje, że ekran powitalny nie będzie w ogóle wyświetlany na urządzeniach z interfejsami API wyższymi niż 23. Być może będziesz musiał również umieścić pierwsza wersja pliku splash_screen.xml do drawable-v24, jako że Android domyślnie ustawia najbliższy folder drawable-vXX, jaki może znaleźć dla zasobów.
źródło
Obecnie pracuję nad ekranem powitalnym z rysowanym wektorem wyśrodkowanym zarówno w poziomie, jak iw pionie. Oto, co otrzymałem na poziomie API 25:
Jeśli chcesz dostosować wymiar rysowanego wektora, zmodyfikuj
android:width
iandroid:height
atrybuty powyżej, niekoniecznie modyfikuj oryginalny rysunkowy.Ponadto moje doświadczenie jest takie, że NIE WOLNO umieszczać wektora do rysowania w tagu bitmapowym, który nigdy nie działa dla mnie. Bitmapa jest przeznaczona do plików w formacie .png, .jpg i .gif, a nie do rysowania wektorowego.
Odniesienie
https://developer.android.com/guide/topics/resources/drawable-resource#LayerList
https://developer.android.com/guide/topics/resources/more-resources.html#Dimension
źródło