VectorDrawable - czy jest dostępny dla wersji Androida wcześniejszych niż Lollipop? [Zamknięte]

87

tło

Zauważyłem, że Android obsługuje teraz jakiś rodzaj rysowania wektorowego, poprzez klasę o nazwie „ VectorDrawable ” (a także AnimatedVectorDrawable , BTW). Dowiedziałem się o tym, patrząc na nowości w Android-Studio .

Zastanawiam się, czy będzie to koniec konieczności wprowadzenia wielu plików w wielu folderach ( mdpi, hdpi, xhdpi, etc). Byłoby to świetne i może w niektórych przypadkach zminimalizować rozmiary aplikacji.

Pytania

Chciałbym zadać kilka pytań dotyczących tej nowej klasy:

  1. Czy można go używać w starszych wersjach Androida, może za pośrednictwem biblioteki nawet biblioteki wsparcia Google?

  2. Nie wiem, jak to działa, ale czy Lollipop obsługuje pliki SVG? Czy może zrobić coś, co można osiągnąć na plikach SVG?

  3. Czy jest jakaś próbka / samouczek / film z jego używania, inny niż dokumentacja, którą znalazłem?

programista Androida
źródło
3
O ile widzę, VectorDrawable to androidalizacja plików SVG. Jednak używam plików SVG od ponad roku, korzystając z bibliotek innych firm . ( android-svg , svg-android i tym podobne). Są podobnie nazwane. Każdy różni się od pozostałych, dlatego wybieraj dokładnie w zależności od potrzeb.
Phantômaxx
7
Stworzyłem narzędzie online do konwersji SVG na wektor zasobów xml (tylko Lollipop) - inloop.github.io/svg2android - To nie było jeszcze tak bardzo testowane we wczesnej wersji alfa. Obsługuje proste pliki svg (obsługiwane przez Androida), przetestowałem go za pomocą inkscape - narysowałem kilka kształtów (prostokąt, okrąg, spirala ...), zaznacz wszystko, a następnie „Ścieżka-> Obiekt do ścieżki”, wyeksportowałem do * .svg i wrzucony do witryny, wygenerowany xml i działa dobrze.
Yuraj
1
@Yuraj Wow, jest super! świetna robota ! I w tak krótkim czasie ... Proszę, weź moje +1. :)
programista Androida
Odnośnie inloop.github.io/svg2android ... W s a very usefull tool but Itakim przypadku uzyskałem niewłaściwy wynik i nie wiem, co jest nie tak ... Hmmm, do dalszego wydania chciałbym, aby to narzędzie zauważyło zły format ... Gdybym Używane czystych plików SVG z 3-Party libs wszystko jest w porządku ...
Alex Zezekalo
@AlexZezekalo Powinieneś o tym napisać na swojej stronie Github: github.com/inloop/svg2android
programista Androida

Odpowiedzi:

39

AKTUALIZACJA W marcu 2016 r

Przez aktualizację Android Support Library 23.2.1 , obsługa rysunków wektorowych i animowanych rysunków wektorowych. (możesz również użyć najnowszego do tego samego)

Zaktualizuj wersję biblioteki w pliku gradle.

compile 'com.android.support:recyclerview-v7:23.2.1'

Obiekty wektorowe umożliwiają zastąpienie wielu zasobów png jedną grafiką wektorową zdefiniowaną w formacie XML. Choć wcześniej ograniczone do lizak i większych urządzeń , zarówno VectorDrawablei AnimatedVectorDrawablesą teraz dostępne za pośrednictwem dwóch nowych Pomoc Biblioteki support-vector-rozciągliwej i animowanych-wektor-rozciągliwej. nowy app:srcCompatatrybut do rysunków wektorów referencyjnych.

Sprawdź źródło na githubie z kilkoma przykładowymi przykładami .

Zmiany w bibliotece Appcompat w wersji 7:

Przywrócono zależność od zasobów wektorowych, aby programiści używający biblioteki appcompat nie byli zmuszeni do korzystania z VectorDrawablejej flag kompilacji.

Amit Vaghela
źródło
3
Jeśli chodzi o obsługę wektorów, czy nie wystarczy zaktualizować wtyczkę gradle i użyć „vectorDrawables.useSupportLibrary = true” w „defaultConfig”?
programista Androida
1
tak, dla Gradle Plugin 2.0+ i Gradle Plugin 1.5 musisz dodać -> android {defaultConfig {generatedDensities = []} // Jest to obsługiwane przez wtyczkę Gradle 2.0+ aaptOptions {additionalParameters "--no-version -vectors "}}
Amit Vaghela
1
Proszę również pokazać tutaj kod. Link może być kiedyś martwy. Za ten wysiłek dostaniesz +1 :)
programista Androida
tak, na pewno. wyśle ​​kod w krótkim czasie na git i tutaj.
Amit Vaghela
2
Z compilepowyższego oświadczenia wynika, że ​​projekt wykorzystuje, RecyclerViewco nie zawsze ma miejsce.
razzledazzle
13

Aktualizacja 2 : Włączają ją ponownie w bibliotece wsparcia 23.4.0:

Dla użytkowników AppCompat dodaliśmy API opt-in, aby ponownie włączyć obsługę Vector Drawables z zasobów (zachowanie znalezione w 23.2) za pośrednictwem AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) - pamiętaj, że nadal może to powodować problemy z wykorzystaniem pamięci i problemy z aktualizacją instancji konfiguracji, dlatego jest ona domyślnie wyłączona.

Sprawdź dostępne teraz 23.4.0

Aktualizacja : to nie działa od wersji 23.3.0. Sprawdź tutaj, aby uzyskać szczegółowe informacje. Drawables proxy nie działają. app:srcCompati setImageResource()pracy.


Obsługa Vector Drawable jest dostępna w Support Library w wersji 23.2 i nowszych. Jednak, aby właściwie używać tych rysunków, należy odwoływać się do nich pośrednio.

Pierwszym krokiem byłoby podbicie AppCompatwersji.

compile 'com.android.support:appcompat-v7:23.2.0'

Po drugie włącz obsługę Vector Drawable. Jeśli używasz wtyczki Gradle, wersja 2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

Inaczej

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

   aaptOptions {  
     additionalParameters "--no-version-vectors"  
   }  
}

Po trzecie , odnieś się do połączonej odpowiedzi .

razzledazzle
źródło
tak, widziałem to. Dziękuję za rozszerzone informacje. Zakładam, że dla rzeczy całego systemu (powiadomienia, widżety, ...) jest to oczywiście niedostępne ...
programista Androida
Jestem pewien, że to powinno działać. Od tego momentu zasadniczo odwołuje się do drawables. Próbowałeś tego? Przykład tam ustawia wektor możliwy do rysowania na a MenuItem, co działa dobrze.
razzledazzle
Czy na pewno zadziała nawet w przypadku powiadomień i widżetów? Mówię o tym, żeby działało na starych wersjach Androida. Jak mogliby sobie z tym poradzić wektory? Nie mogą korzystać z biblioteki wsparcia, prawda?
programista Androida
Cały sens korzystania z wersji Support Library polega na tym, aby wszystko działało w starszych wersjach. Jak udokumentowano, działa aż do API 7 i animowanych rysunków wektorowych z API 11.
razzledazzle
Ponownie, działa to wewnątrz aplikacji, ale co, jeśli spróbujesz użyć ich na zewnątrz, na przykład w powiadomieniach i widżetach? Nie sądzę, że to zadziała, ponieważ nie sądzę, aby inne aplikacje (programy uruchamiające) korzystały z biblioteki wsparcia, nie mówiąc już o pasku powiadomień. Próbowałeś tego?
programista Androida
12

Możesz wypróbować tę bibliotekę pomocy . Obsługuje VectorDrawable i AnimatedVectorDrawable wprowadzone w Lollipop z pełną kompatybilnością wsteczną.

V_J
źródło
Ta biblioteka jest kompatybilna tylko z poziomem API 14 i wyższym, podczas gdy biblioteka Mr Vector jest kompatybilna do 7+.
donturner
@donturner: Zgadzam się z twoim punktem widzenia, ale nie sądzę, aby deweloperzy nadal opracowywali aplikacje dla 7 API.
V_J
4
Może nie API 7, ale zdecydowanie API 10 (Gingerbread), ponieważ stanowi 4,1% rynku Androida ( developer.android.com/about/dashboards/index.html ).
donturner
8

Aby uzupełnić niektóre odpowiedzi tutaj: tak, możesz uzyskać wsparcie dla VectorDrawables przed Lollipop , przynajmniej częściowo.

Jak częściowe? To zależy - zrobiłem ten diagram jako pomoc (ważny dla Support Library 23.4.0 do - co najmniej - 25.1.0).

Wektor ściągawka do rysowania

David Ferrand
źródło
Rzeczywiście, ale myślę, że jeśli pozwolisz mu automatycznie generować pliki png, powinno to być bezpieczne
programista Androida
1
Wyjaśnione w precyzyjny sposób.
Abhijit Kurane
To powinna być akceptowana odpowiedź. Dzięki.
Justin Meiners
6

Niestety, w tym momencie VectorDrawable i AnimatedVectorDrawable nie są dostępne w bibliotece wsparcia. Ale aby skorzystać z tej funkcji w wersjach Pre-Lollipop, możesz użyć nieoficjalnego backportu o nazwie MrVector.

MrVector jest dostępny na Github i będzie obsługiwał Androida w wersji 7+.

Z oficjalnego pliku Readme

Aby dodać zależność MrVector, dodaj następujący wiersz do bloku zależności build.gradle.

compile 'com.telly:mrvector:0.2.0'

Aby utworzyć rysowalny z wektorowego XML,

Drawable drawable = MrVector.inflate(getResources(), R.drawable.vector_android);

Mam nadzieję że to pomoże.

gnuanu
źródło
1
MrVector został wycofany kilka dni temu na rzecz nadchodzącego VectorDrawableCompat, który będzie częścią biblioteki wsparcia.
WindRider
To jest naprawdę świetne. Dzięki za informację.
gnuanu
Tak, nie mogę się doczekać, aby odpicować moją aplikację za pomocą grubych SVG: D
WindRider
1
Przestarzałe. Zamiast tego użyj tego stackoverflow.com/a/30502261/1954675 .
V_J
3

Jeśli używasz VectorDrawable, Android Studio automatycznie wygeneruje odpowiednie pliki PNG (na podstawie Twoich plików XML) dla wersji Pre-Lollipop.

Zwróć uwagę, że te wygenerowane pliki PNG są uważane za BitmapDrawables zamiast VectorDrawables na urządzeniach z interfejsem API poniżej 21 i dlatego nie mogą być animowane ani podobne na tych urządzeniach.

Aby uzyskać więcej informacji, zobacz „kompatybilność wsteczna”: http://android-developers.blogspot.co.at/2015/09/android-studio-14.html

Mehlfikacja
źródło
Tak, został niedawno opublikowany. Jednak używa PNG, zamiast używać wektorów, więc jeśli zmienię rozmiar imageView, który zawiera obraz, będzie on pikselizowany / rozmyty.
programista Androida
@android developer: częściowo masz rację. To zachowanie wystąpi, ale będzie takie samo dla VectorDrawables. Każdy VectorDrawable ma szerokość i wysokość zdefiniowaną w swoim XML (np. Vector_drawable.xml). Jeśli ta szerokość / wysokość jest ustawiona na 50x50dp, ale ustawisz rozmiar ImageView na 100x100dp, wynik będzie nadal zamazany, nawet jeśli używasz Androida 5.0 (i dlatego używasz VectorDrawable zamiast automatycznie generowanego BitmapDrawable). Prawdziwą zaletą VectorDrawable w porównaniu ze zwykłą Bitmapą jest to, że uwzględnia rozdzielczość ekranu i dlatego nie rozmazuje się nawet na wyświetlaczach 4k.
Mehlyfication
Masz na myśli, że VectorDrawable nie wyświetla się dobrze, gdy używasz rozmiaru, który nie był dla niego ustawiony? Ale to zawartość wektoryzowana… Dlaczego miałoby działać inaczej?
programista Androida
Czy generuje pliki PNG również dla animowanych rysunków wektorowych?
Louis CAD
Nie, nie utworzy plików PNG w tym przypadku. Jeśli chcesz animować wektor do rysowania na urządzeniach z systemem Android w wersji wcześniejszej niż Android 5.0, możesz wypróbować VectorDrawableCompat: developer.android.com/reference/android/support/graphics/ ...
Mehlyfication
3

Lollipop nie obsługuje plików SVG bez bibliotek innych firm.

Najlepszym rozwiązaniem, jakie znalazłem, jest biblioteka BetterVectorDrawable wraz z konwerterem SVG na VectorDrawable .

BetterVectorDrawable to implementacja VectorDrawable dla systemu Android 4.0+ z konfigurowalnym zachowaniem awaryjnym w systemie Android 5.0+.

SVG to VectorDrawable Converter to wsadowy konwerter obrazów SVG na pliki zasobów XML VectorDrawable w systemie Android. Wersja online

Linki prowadzą do plików readmes, które zawierają wystarczającą ilość informacji na temat korzystania z biblioteki lib i konwertera.

Uczeń
źródło
2

W tej chwili w bibliotece pomocy technicznej nie ma VectorDrawables.

Funkystein ma rację - VectorDrawable jest podobny do SVG, obsługuje tylko te funkcje rysowania wektorowego, które są najbardziej pożądane, dzięki czemu Android może skupić się na wydajności. Na przykład pathData ma taki sam format jak ciąg „d” SVG.

George Mount
źródło
Będzie to więc miało znaczenie tylko wtedy, gdy Lollipop stanie się wystarczająco popularny, a nawet wtedy nie zapewnia wielu funkcji. :(
programista Androida
Czy znasz jakieś samouczki / próbki / filmy dotyczące nowych interfejsów API wektorów?
programista Androida
2
Znalazłem jeden teraz: blog.sqisland.com/2014/10/… , github.com/chiuki/animated-vector-drawable
programista Android
1

Wspaniałą wiadomością jest to, że firma Google udostępniła bibliotekę obsługi systemu Android w wersji 23.2 obsługującej rysunki wektorowe i animowane rysunki wektorowe!

Ale dzięki dla ludzi, którzy przenieśli tę bibliotekę przed Google!

Właśnie w tym miejscu biblioteki AppCompat są świetne, mogą przywrócić wiele nowych funkcji Androida do znacznie wcześniejszych wersji. Dzięki nowo zaimplementowanej klasie VectorDrawable programiści mogą teraz używać obrazów wektorowych aż do API 7 (Android 2.1 Eclair). Animowane wektory są nieco bardziej ograniczone, sięgają tylko wstecz do API 11 (Android 3.0 Honeycomb), ale nadal obejmuje ponad 97% aktywnych obecnie urządzeń

Przewodnik do użycia:

Odwołaj się do wieku-wektorów autorstwa @chrisbanes

LOG_TAG
źródło
1
Ładny! czy możesz podzielić się przykładami / samouczkami na temat korzystania z interfejsu API wektorów nowej biblioteki pomocy technicznej?
programista Androida
Pewnie ! już dodałem to do mojej listy rzeczy do zrobienia na weekend! :)
LOG_TAG
1
Dziękuję Ci. Jeśli jest krótki, napisz również tutaj.
programista Androida