Pada tata letak saya ingin skala gambar latar belakang (menjaga rasio aspeknya) ke ruang yang dialokasikan ketika halaman dibuat. Adakah yang punya ide bagaimana melakukan ini?
Saya menggunakan layout.setBackgroundDrawable()
dan BitmapDrawable()
untuk mengatur gravity
kliping dan mengisi, tetapi tidak melihat opsi untuk penskalaan.
Jawaban:
Untuk menyesuaikan penskalaan gambar latar belakang buat sumber daya seperti ini:
Maka akan berpusat pada tampilan jika digunakan sebagai latar belakang. Ada juga flag lain: http://developer.android.com/guide/topics/resources/drawable-resource.html
sumber
Belum mencoba melakukan persis apa yang Anda inginkan, tetapi Anda dapat skala menggunakan ImageView
android:scaleType="fitXY"
dan itu akan berukuran sesuai dengan ukuran apa pun yang Anda berikan ImageView.
Jadi Anda bisa membuat FrameLayout untuk tata letak Anda, letakkan ImageView di dalamnya, dan kemudian konten apa pun yang Anda butuhkan di FrameLayout juga dengan latar belakang transparan.
sumber
Ada cara mudah untuk melakukan ini dari drawable:
your_drawable.xml
Satu-satunya downside adalah bahwa jika tidak ada cukup ruang, gambar Anda tidak akan sepenuhnya ditampilkan, tetapi akan terpotong, saya tidak bisa menemukan cara untuk melakukan ini secara langsung dari yang dapat digambar. Tetapi dari pengujian saya berhasil dengan cukup baik, dan itu tidak memotong banyak gambar. Anda bisa bermain lebih banyak dengan opsi gravitasi.
Cara lain adalah dengan hanya membuat tata letak, di mana Anda akan menggunakan
ImageView
dan mengaturscaleType
untukfitCenter
.sumber
error: <item> must have a 'name' attribute.
Untuk mempertahankan rasio aspek yang harus Anda gunakan
android:scaleType=fitCenter
ataufitStart
dll. MenggunakanfitXY
tidak akan menjaga rasio aspek asli gambar!Perhatikan ini hanya berfungsi untuk gambar dengan
src
atribut, bukan untuk gambar latar belakang.sumber
Gunakan gambar sebagai ukuran latar belakang untuk tata letak:
sumber
android:scaleType="centerCrop"
berfungsi.Saat Anda mengatur Drawable of ImageView dengan menggunakan
setBackgroundDrawable
metode ini, gambar akan selalu diskalakan. Parameter sebagaiadjustViewBounds
atau berbedaScaleTypes
hanya akan diabaikan. Satu-satunya solusi untuk menjaga aspek rasio yang saya temukan, adalah mengubah ukuranImageView
setelah memuat gambar Anda. Berikut ini cuplikan kode yang saya gunakan:Dalam cuplikan kode di atas adalah bmp objek Bitmap yang akan ditampilkan dan imageView adalah
ImageView
objekYang penting untuk diperhatikan adalah perubahan parameter tata letak . Ini perlu karena
setMaxHeight
dansetMaxWidth
hanya akan membuat perbedaan jika lebar dan tinggi didefinisikan untuk membungkus konten, bukan untuk mengisi induknya. Isi induk di sisi lain adalah pengaturan yang diinginkan di awal, karena jika tidakcontainerWidth
dancontainerHeight
keduanya akan memiliki nilai sama dengan 0. Jadi, dalam file tata letak Anda, Anda akan memiliki sesuatu seperti ini untuk ImageView Anda:sumber
Ini bukan solusi yang paling performan, tetapi sebagai seseorang menyarankan daripada latar belakang Anda dapat membuat FrameLayout atau RelativeLayout dan menggunakan ImageView sebagai latar belakang semu - elemen lain akan berada tepat di atasnya:
Masalah dengan ImageView adalah bahwa hanya scaleTypes yang tersedia adalah: CENTER, CENTER_CROP, CENTER_INSIDE, FIT_CENTER, FIT_END, FIT_START, FIT_XY, MATRIX ( http://etcodehome.blogspot.de/2011/05/android-imageview-scaletype-samples.html )
dan untuk "skala gambar latar (menjaga rasio aspeknya)" dalam beberapa kasus, ketika Anda ingin gambar untuk mengisi seluruh layar (misalnya gambar latar belakang) dan rasio aspek layar berbeda dari gambar, skala yang diperlukanTipe dari TOP_CROP, karena:
CENTER_CROP menempatkan gambar berskala tengah alih-alih menyejajarkan tepi atas ke tepi atas tampilan gambar dan FIT_START sesuai dengan ketinggian layar dan tidak memenuhi lebar. Dan seperti yang diketahui pengguna, FIT_XY tidak mempertahankan rasio aspek.
Dengan senang hati seseorang telah memperluas ImageView untuk mendukung TOP_CROP
https://stackoverflow.com/a/14815588/2075875
Sekarang IMHO akan sempurna jika seseorang menulis Drawable kustom yang skala gambarnya seperti itu. Kemudian bisa digunakan sebagai parameter latar belakang.
Reflog menyarankan untuk mengatur skala drawable sebelum menggunakannya. Berikut ini instruksi cara melakukannya: Java (Android): Bagaimana skala gambar yang dapat digambar tanpa Bitmap? Meskipun memiliki kekurangan, drawable / bitmap yang ditingkatkan akan menggunakan lebih banyak RAM, sementara scaling on the fly yang digunakan oleh ImageView tidak memerlukan lebih banyak memori. Keuntungannya bisa lebih sedikit beban prosesor.
sumber
Kode di bawah ini membuat bitmap sempurna dengan ukuran imageview yang sama. Dapatkan tinggi dan lebar gambar bitmap lalu hitung tinggi dan lebar baru dengan bantuan parameter imageview. Itu memberi Anda gambar yang diperlukan dengan rasio aspek terbaik.
sumber
Apa yang Dweebo usulkan berhasil. Tetapi menurut pendapat saya yang sederhana itu tidak perlu. Latar belakang dapat digambar dengan baik dengan sendirinya. Tampilan harus memiliki lebar dan tinggi tetap, seperti dalam contoh berikut:
sumber
Satu opsi untuk dicoba adalah dengan meletakkan gambar di
drawable-nodpi
folder dan mengatur latar belakang tata letak ke id sumber daya yang dapat digambar.Ini pasti bekerja dengan scaling down, saya belum menguji dengan scaling up sekalipun.
sumber
Kotlin:
Jika Anda perlu menggambar bitmap di Tampilan, diskalakan ke FIT.
Anda dapat melakukan perhitungan yang tepat untuk mengatur bm tinggi sama dengan wadah dan menyesuaikan lebar, dalam hal bm rasio lebar terhadap tinggi kurang dari rasio lebar kontainer terhadap tinggi, atau kebalikan dalam skenario yang berlawanan.
Gambar-gambar:
sumber
Anda harus melakukan pra-skala gambar yang dapat digambar sebelum menggunakannya sebagai latar belakang
sumber
Anda dapat menggunakan salah satu dari berikut ini:
android: gravity = "fill_horizontal | clip_vertical"
Atau
android: gravity = "fill_vertical | clip_horizontal"
sumber