Saya mencoba menggunakan vector drawable di aplikasi Android saya. Dari http://developer.android.com/training/material/drawables.html (penekanan saya):
Di Android 5.0 (API Level 21) dan yang lebih baru, Anda bisa menentukan vector drawable, yang menskalakan tanpa kehilangan definisi.
Menggunakan drawable ini:
<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" />
dan ImageView ini:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
menghasilkan gambar buram ini saat mencoba menampilkan ikon pada 400dp (pada perangkat seluler beresolusi tinggi yang besar sekitar tahun 2015 yang menjalankan lollipop):
Mengubah lebar dan tinggi dalam definisi drawable vektor menjadi 200dp secara signifikan meningkatkan situasi pada ukuran yang dirender 400dp. Namun, menyetel ini sebagai drawable untuk elemen TextView (yaitu ikon di sebelah kiri teks) sekarang membuat ikon besar.
Pertanyaan saya:
1) Mengapa ada spesifikasi lebar / tinggi pada drawable vektor? Saya pikir intinya adalah bahwa skala naik dan turun tanpa kerugian membuat lebar dan tinggi menjadi tidak berarti dalam definisinya?
2) Apakah mungkin untuk menggunakan satu vector drawable yang berfungsi sebagai drawable 24dp pada TextView tetapi dapat diskalakan dengan baik untuk menggunakan gambar yang jauh lebih besar juga? Misalnya, bagaimana cara menghindari pembuatan beberapa vektor yang dapat digambar dengan ukuran berbeda dan sebagai gantinya menggunakan salah satu skala yang sesuai dengan persyaratan yang saya berikan?
3) Bagaimana cara saya menggunakan atribut lebar / tinggi secara efektif dan apa perbedaannya dengan viewportWidth / Height?
Detil tambahan:
- Perangkat menjalankan API 22
- Menggunakan Android Studio v1.5.1 dengan Gradle versi 1.5.0
- Manifes adalah kompilasi dan target level 23, min level 15. Saya juga mencoba memindahkan min level ke 21, tapi ini tidak ada bedanya.
- Mendekompilasi APK (dengan set level minimal ke 21) menunjukkan satu sumber daya XML dalam folder drawable. Tidak ada gambar raster yang dihasilkan.
New -> Vector Asset
, XML gambar vektor akan jatuh ke folder drawable saya. Namun jika saya menggunakan apktool untuk membongkar APK yang dibangun, saya melihat bahwa file XML adadrawable-anydpi-v21
dan menskalakan dengan benar pada perangkat API 21+. File raster ditempatkan didrawable-<mdpi/hdpi/etc>-v4
folder dan tidak digunakan pada perangkat API 21+ (berdasarkan fakta bahwa skalanya dengan benar)drawable
foldernya. Lebar / tinggi dalam file xml drawable vektor adalah 24 dp. Menentukan ImageView dengan tinggi / lebar 400dp pasti akan menghasilkan gambar dengan skala yang buruk.drawable-anydpi-v21
adalah karena myminSdkVersion
kurang dari 21. Adakah perubahan perilaku jika Anda menyetelminSdkVersion
ke kurang dari 21? Bagaimana dengan memindahkan XML kedrawable-anydpi
? Saya tidak berharap ada perubahan tetapi saya juga berharap gambar vektor Anda diskalakan dengan benar ...drawable-anydpi-v21
dengan berbagai gambar raster di mdi / hdpi / etc. folder. Tidak ada perubahan pada hasil akhir yang diberikan.Jawaban:
Ada info baru tentang masalah ini di sini:
https://code.google.com/p/android/issues/detail?id=202019
Sepertinya penggunaan
android:scaleType="fitXY"
akan membuatnya berskala dengan benar di Lollipop.Dari seorang insinyur Google:
sumber
Untuk versi SDK yang kurang dari 21 yang sistem build perlu menghasilkan gambar raster dan sebagai ukuran default jika Anda tidak menentukan lebar / tingginya.
Saya tidak percaya ini mungkin jika Anda juga perlu menargetkan SDK kurang dari 21.
Dokumentasi: (sebenarnya tidak terlalu berguna sekarang setelah saya membacanya kembali ...)
Dokumentasi lainnya:
Sunting: Sesuatu yang aneh sedang terjadi. Berikut hasil saya di emulator SDK versi 23 (perangkat uji Lollipop + mati sekarang ...):
Dan di SDK emulator versi 21:
sumber
width
height
viewport
height
danwidth
darixml
?AppCompat 23.2 memperkenalkan vector drawable untuk semua perangkat yang menjalankan Android 2.1 dan yang lebih baru. Gambar diskalakan dengan benar, terlepas dari lebar / tinggi yang ditentukan dalam file XML drawable vektor. Sayangnya, implementasi ini tidak digunakan di API level 21 ke atas (mendukung implementasi asli).
Kabar baiknya adalah kita bisa memaksa AppCompat untuk menggunakan implementasinya pada API level 21 dan 22. Kabar buruknya adalah kita harus menggunakan refleksi untuk melakukan ini.
Pertama-tama, pastikan Anda menggunakan AppCompat versi terbaru, dan Anda telah mengaktifkan implementasi vektor baru:
Kemudian, panggil
useCompatVectorIfNeeded();
onCreate () Aplikasi Anda:Terakhir, pastikan Anda menggunakan
app:srcCompat
alih-alihandroid:src
menyetel gambar ImageView Anda:Drawable vektor Anda sekarang harus diskalakan dengan benar!
sumber
1) Mengapa ada spesifikasi lebar / tinggi pada drawable vektor? Saya pikir intinya adalah bahwa skala naik dan turun tanpa kerugian membuat lebar dan tinggi tidak berarti dalam definisinya?
2) Apakah mungkin menggunakan satu vector drawable yang berfungsi sebagai drawable 24dp pada TextView serta gambar lebar dekat layar yang besar?
3) Bagaimana cara saya menggunakan atribut lebar / tinggi secara efektif dan apa perbedaannya dengan viewportWidth / Height?
sumber
Saya menyelesaikan masalah saya hanya dengan mengubah ukuran gambar vektor. Dari awal itu adalah sumber daya seperti:
Dan saya telah mengubahnya menjadi 150dp (ukuran ImageView dalam tata letak dengan sumber daya vektor ini) seperti:
Ini bekerja untuk saya.
sumber
Saya mencoba cara-cara ini tetapi sayangnya, tidak ada yang berhasil. Aku mencoba
fitXY
diImageView
, saya mencoba menggunakanapp:srcCompat
tapi bahkan tidak bisa menggunakannya. tapi saya menemukan cara trik:Tetapi inti dari cara ini adalah dimensi Tampilan. jika Anda
ImageView
memiliki dimensi yang salah, drawable akan mengalami Stretch. Anda harus mengontrolnya dalam versi pra-lollipop atau Gunakan beberapa TampilanPercentRelativeLayout
.Semoga bermanfaat.
sumber
Pertama : impor svg ke drawble: (( https://www.learn2crack.com/2016/02/android-studio-svg.html ))
Kedua : jika Anda menginginkan dukungan dari android API 7+, Anda harus menggunakan Android Support Library menurut catatan (( https://stackoverflow.com/a/44713221/1140304 ))
1- tambahkan
ke file build.gradle Anda.
2-Gunakan namespace di tata letak Anda yang memiliki imageView:
Ketiga : setel imageView dengan android: scaleType = "fitXY" dan gunakan app: srcCompat
Keempat : jika Anda ingin mengatur svg dalam kode java Anda harus menambahkan baris di bawah ini pada methoed oncreate
sumber
Bagi saya alasan yang menyebabkan vektor dikonversi menjadi png adalah
android:fillType="evenodd"
atribut dalam drawable vektor saya. Ketika saya menghapus semua kemunculan atribut ini di drawable saya (untuk itunonzero
jenis isian default yang diterapkan ke vektor), lain kali aplikasi dibangun semuanya baik-baik saja.sumber