Saya ingin mengunduh gambar (dengan ukuran tidak diketahui, tetapi selalu berbentuk persegi) dan menampilkannya sehingga memenuhi layar secara horizontal, dan membentang secara vertikal untuk mempertahankan rasio aspek gambar, pada ukuran layar apa pun. Ini kode saya (tidak berfungsi). Ini meregangkan gambar secara horizontal, tetapi tidak secara vertikal, sehingga terjepit ...
ImageView mainImageView = new ImageView(context);
mainImageView.setImageBitmap(mainImage); //downloaded from server
mainImageView.setScaleType(ScaleType.FIT_XY);
//mainImageView.setAdjustViewBounds(true);
//with this line enabled, just scales image down
addView(mainImageView,new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
Jawaban:
Saya menyelesaikan ini dengan tampilan kustom. Setel layout_width = "fill_parent" dan layout_height = "wrap_content", dan arahkan ke drawable yang sesuai:
sumber
Pada akhirnya, saya membuat dimensi secara manual, yang berfungsi dengan baik:
sumber
Saya baru saja membaca kode sumbernya
ImageView
dan pada dasarnya tidak mungkin tanpa menggunakan solusi subclassing di utas ini. DiImageView.onMeasure
kita sampai ke baris ini:Dimana
h
danw
apakah dimensi gambar, danp*
merupakan paddingnya.Lalu:
Jadi jika sudah
layout_height="wrap_content"
akan di aturwidthSize = w + pleft + pright
, atau dengan kata lain lebar maksimum sama dengan lebar gambar.Artinya, kecuali Anda menyetel ukuran yang tepat, gambar TIDAK PERNAH diperbesar . Saya menganggap ini sebagai bug, tapi semoga berhasil membuat Google memperhatikan atau memperbaikinya. Edit: Makan kata-kata saya sendiri, saya serahkan laporan bug dan mereka mengatakan itu telah diperbaiki di rilis mendatang!
Solusi lain
Berikut adalah solusi subclass lain, tetapi Anda harus (secara teori, saya belum benar-benar mengujinya!) Dapat menggunakannya di mana pun Anda
ImageView
. Untuk menggunakannya, setlayout_width="match_parent"
, danlayout_height="wrap_content"
. Ini jauh lebih umum daripada solusi yang diterima juga. Misalnya Anda bisa melakukan fit-to-height serta fit-to-width.sumber
Menyetel adjustViewBounds ke true dan menggunakan grup tampilan LinearLayout bekerja dengan sangat baik untuk saya. Tidak perlu membuat subkelas atau meminta metrik perangkat:
sumber
Saya telah berjuang dengan masalah ini dalam satu bentuk atau lainnya selama USIA, terima kasih, Terima Kasih, TERIMA KASIH .... :)
Saya hanya ingin menunjukkan bahwa Anda bisa mendapatkan solusi yang dapat digeneralisasi dari apa yang dilakukan Bob Lee hanya dengan memperluas View dan menimpa onMeasure. Dengan begitu, Anda dapat menggunakan ini dengan drawable apa pun yang Anda inginkan, dan tidak akan rusak jika tidak ada gambar:
sumber
Dalam beberapa kasus, formula ajaib ini memecahkan masalah dengan indah.
Bagi siapa pun yang berjuang dengan ini yang datang dari platform lain, "ukuran dan bentuk agar pas" ditangani dengan indah di Android, tetapi sulit ditemukan.
Anda biasanya menginginkan kombinasi ini:
Kemudian otomatis dan luar biasa.
Jika Anda seorang pengembang iOS, sungguh menakjubkan betapa sederhananya, di Android, Anda dapat melakukan "ketinggian sel yang benar-benar dinamis" dalam tampilan tabel .. err, maksud saya ListView. Nikmati.
sumber
Saya telah berhasil mencapai ini hanya dengan menggunakan kode XML ini. Mungkin kasus gerhana tidak membuat ketinggian untuk menunjukkan itu meluas agar sesuai; Namun, ketika Anda benar-benar menjalankan ini di perangkat, itu membuat dengan benar dan memberikan hasil yang diinginkan. (baik setidaknya untuk saya)
sumber
src
dan ImageView menjadi proporsional.Saya melakukannya dengan nilai-nilai ini dalam LinearLayout:
sumber
Semua orang melakukan ini dengan program jadi saya pikir jawaban ini akan sangat cocok di sini. Kode ini bekerja untuk saya di xml. Saya BELUM memikirkan tentang rasio, tetapi masih ingin menempatkan jawaban ini jika itu akan membantu siapa pun.
Bersulang..
sumber
Solusi yang sangat sederhana adalah dengan hanya menggunakan fitur yang disediakan oleh
RelativeLayout
.Berikut adalah xml yang memungkinkan dengan Android standar
Views
:Triknya adalah Anda mengatur
ImageView
untuk mengisi layar tetapi harus berada di atas tata letak lainnya. Dengan cara ini Anda mencapai semua yang Anda butuhkan.sumber
Ini masalah sederhana dalam pengaturan
adjustViewBounds="true"
danscaleType="fitCenter"
file XML untuk ImageView!Catatan:
layout_width
disetel kematch_parent
sumber
Anda mengatur ScaleType ke ScaleType.FIT_XY. Menurut javadocs , ini akan meregangkan gambar agar pas dengan seluruh area, mengubah rasio aspek jika perlu. Itu akan menjelaskan perilaku yang Anda lihat.
Untuk mendapatkan perilaku yang Anda inginkan ... FIT_CENTER, FIT_START, atau FIT_END hampir sama, tetapi jika gambar lebih sempit daripada tingginya, gambar tidak akan mulai mengisi lebarnya. Anda dapat melihat bagaimana penerapannya, dan Anda mungkin dapat mengetahui bagaimana menyesuaikannya untuk tujuan Anda.
sumber
ScaleType.CENTER_CROP akan melakukan apa yang Anda inginkan: melebarkan hingga lebar penuh, dan menskalakan tingginya sesuai keinginan. jika ketinggian yang diskalakan melebihi batas layar, gambar akan dipotong.
sumber
Lihat, ada solusi yang jauh lebih mudah untuk masalah Anda:
sumber
Anda dapat menggunakan StretchableImageView saya dengan mempertahankan rasio aspek (menurut lebar atau tinggi) bergantung pada lebar dan tinggi drawable:
sumber
Bagi saya, android: scaleType = "centerCrop" tidak menyelesaikan masalah saya. Itu sebenarnya memperluas citra jauh lebih banyak. Jadi saya mencoba dengan android: scaleType = "fitXY" dan berhasil dengan sangat baik.
sumber
Ini bekerja dengan baik sesuai kebutuhan saya
<ImageView android:id="@+id/imgIssue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY"/>
sumber