Dalam aplikasi saya, saya harus mengatur ikon besar untuk pemberitahuan. LargeIcon harus berupa Bitmap, dan gambar saya yang bisa digambar adalah gambar vektor (fitur baru di Android, lihat tautan ini ) Masalahnya adalah ketika saya mencoba mendekodekan sumber daya yang merupakan gambar vektor, saya mendapatkan pengembalian nol.
Berikut ini contoh kode:
if (BitmapFactory.decodeResource(arg0.getResources(), R.drawable.vector_menu_objectifs) == null)
Log.d("ISNULL", "NULL");
else
Log.d("ISNULL", "NOT NULL");
Dalam sampel ini, ketika saya mengganti R.drawable.vector_menu_objectifs dengan gambar "normal", png untuk contoh, hasilnya bukan nol (saya mendapatkan bitmap yang benar) Apakah ada sesuatu yang saya lewatkan?
Jawaban:
Diperiksa di API: 17, 21, 23
MEMPERBARUI:
Proyek gradle:
Modul gradle:
sumber
AppCompatDrawableManager
ditandai sebagai@RestrictTo(LIBRARY_GROUP)
internal dan Anda tidak boleh menggunakannya (API itu dapat berubah tanpa pemberitahuan). GunakanContextCompat
sebagai gantinya.Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
pada baris iniBitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Anda dapat menggunakan metode berikut:
yang terkadang saya gabungkan dengan:
sumber
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
pada baris iniBitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Jika Anda bersedia menggunakan KTX Android untuk Kotlin, Anda dapat menggunakan metode ekstensi
Drawable#toBitmap()
untuk mencapai efek yang sama dengan jawaban lainnya:atau
Untuk menambahkan ini dan metode ekstensi lain yang berguna, Anda perlu menambahkan yang berikut ke tingkat modul Anda
build.gradle
Lihat di sini untuk instruksi terbaru untuk menambahkan ketergantungan pada proyek Anda.
Perhatikan bahwa ini akan bekerja untuk setiap subkelas
Drawable
dan jikaDrawable
ada,BitmapDrawable
maka akan digunakan pintasan untuk menggunakan yang mendasarinyaBitmap
.sumber
VectorDrawable
.Berdasarkan jawaban sebelumnya dapat disederhanakan seperti itu untuk mencocokkan VectorDrawable dan BitmapDrawable dan agar kompatibel dengan setidaknya API 15.
Maka Anda harus menambahkan file gradle Anda:
Pada pra-Lollipop akan menggunakan VectorDrawableCompat dan pada Lollipop akan menggunakan VectorDrawable.
EDIT
Saya telah mengedit kondisi setelah komentar dari @ user3109468
sumber
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && drawable instanceof VectorDrawable)
Kudos to @Alexey
Ini adalah
Kotlin
versi yang menggunakan ekstensi untukContext
Contoh penggunaan di
Activity
:sumber
Diuji pada API 16 - JellyBean dengan Drawables Vector
sumber
Gunakan kode berikut untuk mengonversi gambar dengan rasio aspek yang benar (misalnya, untuk ikon pemberitahuan):
sumber
Jika Anda
vector
gambarintrinsicWidth
danintrinsicHeight
kecil dan Anda mencoba untuk menampilkan bitmap untuk tampilan besar, maka Anda akan melihat hasilnya blur.Dalam hal ini, Anda dapat memberikan lebar / tinggi baru untuk bitmap Anda untuk mendapatkan gambar yang lebih baik (atau Anda dapat meningkatkan ukuran vektor dalam xml, tetapi berikan
desireWidth
dandesireHeight
mungkin lebih fleksibel).Semoga ini bisa membantu
sumber
sumber
Jika Anda ingin dapat menskalakan output Anda ke ukuran output yang diinginkan, coba cuplikan berikut:
sumber
Ini memberi Anda bitmap dalam ukuran yang Anda inginkan. Selain itu, ini memungkinkan Anda untuk mempertahankan atau tidak transparansi tergantung pada setiap gambar untuk kinerja yang lebih baik dengan yang tidak membutuhkannya.
sumber