Saya memiliki tampilan gambar. Saya ingin lebarnya menjadi fill_parent. Saya ingin tingginya menjadi apa pun yang akhirnya menjadi lebar. Sebagai contoh:
<ImageView
android:layout_width="fill_parent"
android:layout_height="whatever the width ends up being" />
Apakah sesuatu seperti itu dimungkinkan dalam file tata letak tanpa harus membuat kelas tampilan saya sendiri?
Terima kasih
Jawaban:
Pembaruan: 14 Sep 2017
Menurut komentar di bawah ini, pustaka dukungan persen tidak digunakan lagi sebagai Pustaka Dukungan Android 26.0.0. Ini adalah cara baru untuk melakukannya:
Lihat di sini
Usang:
Menurut pos ini oleh Pengembang Android, yang perlu Anda lakukan sekarang adalah membungkus apa pun yang Anda inginkan dalam PercentRelativeLayout atau PercentFrameLayout, dan kemudian tentukan rasio-rasionya, seperti
sumber
Mungkin ini akan menjawab pertanyaan Anda:
Anda dapat mengabaikan
scaleType
atribut untuk situasi khusus ini.sumber
Ini dapat dilakukan dengan menggunakan LayoutParams untuk secara dinamis mengatur tinggi Tampilan setelah Anda tahu lebar Tampilan saat runtime. Anda perlu menggunakan utas Runnable untuk mendapatkan lebar Tampilan saat runtime atau Anda akan mencoba mengatur Tinggi sebelum Anda tahu lebar Tampilan karena tata letak belum digambar.
Contoh bagaimana saya memecahkan masalah saya:
LayoutParams harus dari jenis Tampilan Induk tempat tampilan Anda. FrameLayout saya ada di dalam RelativeLayout dalam file xml.
dipanggil untuk memaksa tampilan redraw saat berada di utas terpisah dari utas UI
sumber
onMeasure
, seperti yang ditunjukkan dalam jawaban Regis . Alternatif, tetapi hanya untuk tampilan yang diberikan melalui adaptor, misalnya di dalamGridView
, adalah jawaban Matt .requestLayout()
setelah mengatur parameter. mengapa itu bisa terjadi?Saya tidak bisa mendapatkan jawaban David Chu bekerja untuk item RecyclerView dan tahu saya perlu membatasi ImageView ke orang tua. Tetapkan lebar ImageView ke
0dp
dan membatasi mulai dan berakhir ke induk. Saya tidak yakin apakah mengatur lebarwrap_content
ataumatch_parent
berfungsi dalam beberapa kasus, tapi saya pikir ini adalah cara yang lebih baik untuk mendapatkan anak dari ConstraintLayout untuk mengisi induknya.sumber
Di sini saya apa yang saya lakukan untuk memiliki ImageButton yang selalu memiliki lebar sama dengan tingginya (dan menghindari margin kosong bodoh dalam satu arah ... yang saya anggap sebagai bug dari SDK ...):
Saya mendefinisikan kelas SquareImageButton yang memanjang dari ImageButton:
Inilah xml saya:
Bekerja seperti pesona!
sumber
Di Android 26.0.0 PercentRelativeLayout telah ditinggalkan .
Cara terbaik untuk menyelesaikannya sekarang dengan
ConstraintLayout
seperti ini:Berikut ini adalah tutorial tentang cara menambahkan
ConstraintLayout
ke proyek Anda.sumber
Jika tampilan gambar Anda berada di dalam tata letak kendala, Anda dapat menggunakan batasan berikut untuk membuat tampilan gambar persegi
sumber
Anda tidak dapat melakukannya dengan tata letak saja, saya sudah mencoba. Saya akhirnya menulis kelas yang sangat sederhana untuk menanganinya, Anda dapat memeriksanya di github. SquareImage.java Bagian dari proyek yang lebih besar tetapi tidak ada sedikit copy dan paste yang tidak dapat diperbaiki (dilisensikan dengan Apache 2.0)
Pada dasarnya Anda hanya perlu mengatur tinggi / lebar sama dengan dimensi lain (tergantung pada cara mana Anda ingin skala itu)
Catatan: Anda bisa membuatnya persegi tanpa kelas khusus menggunakan
scaleType
atribut tetapi batas tampilan melampaui gambar yang terlihat, yang membuatnya menjadi masalah jika Anda menempatkan tampilan lain di dekat itu.sumber
Untuk mengatur ImageView Anda sama dengan setengah layar, Anda perlu menambahkan berikut ini ke XML Anda untuk ImageView:
Untuk mengatur tinggi sama dengan lebar ini, Anda harus melakukannya dalam kode. Dalam
getView
metodeGridView
adaptor Anda , aturImageView
tingginya sama dengan lebarnya yang diukur:sumber
Untuk orang yang lewat sekarang, pada 2017, cara terbaik baru untuk mencapai apa yang Anda inginkan adalah dengan menggunakan ConstraintLayout seperti ini:
Dan jangan lupa untuk menambahkan batasan ke keempat arah sebagaimana diperlukan oleh tata letak Anda.
Bangun UI Responsif dengan ConstraintLayout
Selain itu, saat ini, PercentRelativeLayout telah ditinggalkan (lihat dokumentasi Android ).
sumber
Inilah cara saya memecahkan masalah itu:
pratinjau - imageView dengan lebar disetel ke "match_parent" dan scaleType ke "cropCenter"
gambar - objek Bitmap untuk diatur dalam imageView src.
Itu bekerja cukup baik untuk saya.
sumber
= vw*ph/pw
daripada yang lebih sederhana= vw
. (Saya pikir Anda melakukan ini untuk mempertahankan rasio aspek gambar sumber, daripada memaksakan pratinjau segi empat.)Saya tidak berpikir ada cara Anda bisa melakukannya dalam file layout XML, dan saya tidak berpikir
android:scaleType
atribut akan berfungsi seperti yang Anda inginkan.Satu-satunya cara adalah melakukannya secara terprogram. Anda dapat mengatur lebar menjadi fill_parent dan dapat menggunakan lebar layar sebagai ketinggian metode
View
atau dapat menggunakanView.getWidth()
.sumber
Fungsi ImageView "scaleType" dapat membantu Anda di sini.
Kode ini akan menjaga rasio aspek dan menempatkan gambar di atas:
Berikut ini adalah pos yang bagus yang menunjukkan kemungkinan dan penampilan dari menggunakan scaleType.
Sampel ImageType scaleType
sumber
saya suka ini -
sumber