Próbuję użyć rysunków wektorowych w mojej aplikacji na Androida. Z http://developer.android.com/training/material/drawables.html (moje wyróżnienie):
W systemie Android 5.0 (poziom interfejsu API 21) i nowszych można zdefiniować elementy wektorowe, które skalują się bez utraty definicji.
Korzystanie z tego do rysowania:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />
i ten ImageView:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
powoduje wyświetlenie tego rozmytego obrazu podczas próby wyświetlenia ikony w rozdzielczości 400 dp (na dużym urządzeniu mobilnym o wysokiej rozdzielczości z około 2015 r., na którym działa Lollipop):
Zmiana szerokości i wysokości w definicji wektora rysowanego do 200dp znacząco poprawia sytuację przy wyrenderowanym rozmiarze 400dp. Jednak ustawienie tego jako możliwego do rysowania dla elementu TextView (tj. Ikony po lewej stronie tekstu) tworzy teraz ogromną ikonę.
Moje pytania:
1) Dlaczego w wektorze do rysowania istnieje specyfikacja szerokości / wysokości? Myślałem, że chodzi o to, że skalują się w górę iw dół bezstratnie, przez co szerokość i wysokość nie mają znaczenia w swojej definicji?
2) Czy możliwe jest użycie pojedynczego wektora do rysowania, który działa jako rysowany w formacie 24dp na TextView, ale dobrze skaluje się, aby używać również znacznie większych obrazów? Np. Jak uniknąć tworzenia wielu rysunków wektorowych o różnych rozmiarach i zamiast tego użyć takiego, który skaluje się do moich renderowanych wymagań?
3) Jak efektywnie wykorzystać atrybuty szerokości / wysokości i jaka jest różnica z viewportWidth / Height?
Dodatkowe Szczegóły:
- Na urządzeniu działa API 22
- Korzystanie z Android Studio w wersji 1.5.1 z Gradle w wersji 1.5.0
- Manifest jest kompilacją i docelowym poziomem 23, minimalnym poziomem 15. Próbowałem również przenieść minimalny poziom na 21, ale to nie miało znaczenia.
- Dekompilacja APK (z minimalnym poziomem ustawionym na 21) pokazuje pojedynczy zasób XML w folderze do rysowania. Nie są tworzone żadne obrazy rasteryzowane.
New -> Vector Asset
, upuszczam XML obrazu wektorowego do mojego folderu do rysowania. Jeśli jednak używam apktool do rozpakowywania kompilowanego pliku APK, widzę, że pliki XML sądrawable-anydpi-v21
zapisane i poprawnie skalują na urządzeniach z interfejsem API 21+. Pliki rastrowe są umieszczone wdrawable-<mdpi/hdpi/etc>-v4
folderach i nie są wykorzystywane w urządzeniach API 21+ (na podstawie faktu, że skala ich poprawnie)