Di Android, ImageView adalah persegi panjang secara default. Bagaimana saya bisa membuatnya menjadi persegi panjang bulat (memotong semua 4 sudut Bitmap saya menjadi persegi panjang bulat) di ImageView?
573
Di Android, ImageView adalah persegi panjang secara default. Bagaimana saya bisa membuatnya menjadi persegi panjang bulat (memotong semua 4 sudut Bitmap saya menjadi persegi panjang bulat) di ImageView?
ShapeableImageView
membuat imageView stackoverflow.com/a/61086632/7666442Jawaban:
Ini agak terlambat dalam respons, tetapi untuk orang lain yang mencari ini, Anda dapat melakukan kode berikut untuk secara manual mengitari sudut-sudut gambar Anda.
http://www.ruibm.com/?p=184
Ini bukan kode saya, tapi saya sudah menggunakannya dan ini bekerja dengan sangat baik. Saya menggunakannya sebagai penolong dalam kelas ImageHelper dan memperpanjangnya hanya sedikit untuk memberikan jumlah bulu yang saya butuhkan untuk gambar yang diberikan.
Kode akhir terlihat seperti ini:
Semoga ini bisa membantu seseorang!
sumber
Sementara jawaban di atas berfungsi, Romain Guy (pengembang Android inti) menunjukkan metode yang lebih baik di blognya yang menggunakan lebih sedikit memori dengan menggunakan shader yang tidak membuat salinan bitmap. Inti umum dari fungsionalitas ada di sini:
Keuntungan dari ini dibandingkan metode lain adalah:
Saya telah membuat RoundedImageView berdasarkan kode ini yang membungkus logika ini menjadi ImageView dan menambahkan
ScaleType
dukungan yang tepat dan batas bulat opsional.sumber
/ example / res / layout / rounded_item.xml
mengapa Anda menentukan gambar src ketika semua sumber Anda hardcoded? Demo yang bagus, hanya cara yang berlebihan.Cara mudah lainnya adalah dengan menggunakan CardView dengan radius sudut dan ImageView di dalam:
sumber
Kliping ke bentuk bulat ditambahkan ke
View
kelas di API 21.Lakukan ini:
res / drawable / round_outline.xml
android:background="@drawable/round_outline"
android:clipToOutline="true"
Sayangnya, ada bug dan atribut XML itu tidak dikenali. Untungnya, kita masih dapat mengatur kliping di Jawa:
ImageView.setClipToOutline(true)
Ini akan terlihat seperti apa:
catatan:
Metode ini berfungsi untuk semua bentuk yang dapat digambar (tidak hanya membulat). Ini akan klip ImageView ke bentuk bentuk apa pun yang Anda tetapkan dalam Drawable xml Anda.
Catatan khusus tentang ImageViews
setClipToOutline()
hanya berfungsi ketika latar belakang Tampilan diatur ke bentuk yang dapat digambar. Jika bentuk latar belakang ini ada, Lihat memperlakukan garis bentuk sebagai batas untuk kliping dan tujuan membayangi.Ini berarti, jika Anda ingin menggunakan
setClipToOutline()
untuk membulatkan sudut pada ImageView, gambar Anda harus ditetapkan menggunakanandroid:src
bukanandroid:background
(karena latar belakang harus diatur ke bentuk bulat Anda). Jika Anda HARUS menggunakan latar belakang untuk mengatur gambar Anda alih-alih src, Anda dapat menggunakan solusi ini:sumber
android:clipToOutline
, seseorang harus menggunakanandroid:outlineProvider="background"
.Di v21 dari pustaka dukungan sekarang ada solusi untuk ini: itu disebut RoundedBitmapDrawable .
Ini pada dasarnya sama seperti Drawable normal kecuali Anda memberinya radius sudut untuk kliping dengan:
Jadi, dimulai dengan
Bitmap src
dan targetImageView
, akan terlihat seperti ini:sumber
android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory
begituv4
juga mendukung hal itu.v4
perpustakaan dukungan tetapi tidak sampaiREVISION 21
perpustakaan pendukungscaleType
centerCrop
(perpustakaan dukungan v25.3.1)Saya telah melakukannya oleh Custom ImageView:
Cara Penggunaan:
Keluaran:
Semoga ini bisa membantu Anda.
sumber
Canvas.clipPath()
java.lang.UnsupportedOperationException
dalam beberapa kasus dapat menyebabkan . Lihat stackoverflow.com/questions/13248904/…android:background
, tetapi tidakandroid:src
.Solusi xml cepat -
Anda dapat mengatur lebar, tinggi, dan radius yang Anda inginkan pada CardView dan scaleType di ImageView.
Dengan AndroidX, gunakan
<androidx.cardview.widget.CardView>
sumber
scaleType="fitXY"
dan tidak terlihat tepat @ThemBonesSaya menemukan bahwa kedua metode sangat membantu dalam menghasilkan solusi yang berfungsi. Ini adalah versi komposit saya, yaitu pixel-independent dan memungkinkan Anda untuk memiliki beberapa sudut persegi dengan sisa sudut lainnya memiliki jari-jari yang sama (yang merupakan kasus penggunaan biasa). Dengan terima kasih kepada kedua solusi di atas:
Juga, saya mengesampingkan ImageView untuk memasukkan ini sehingga saya bisa mendefinisikannya dalam xml. Anda mungkin ingin menambahkan beberapa logika yang dibuat oleh panggilan super di sini, tapi saya sudah berkomentar karena itu tidak membantu dalam kasus saya.
Semoga ini membantu!
sumber
Gambar bulat Menggunakan
ImageLoader
di siniBuat
DisplayImageOptions
:Atau Anda dapat menggunakan
Picasso
Library dari Square.Anda dapat mengunduh file RoundedTransformation di sini di sini
sumber
Karena semua jawaban tampak terlalu rumit bagi saya hanya untuk sudut-sudut, saya pikir dan datang ke solusi lain yang saya pikir layak untuk dibagikan, hanya dengan XML jika Anda memiliki ruang di sekitar gambar:
Buat bentuk berbatasan dengan konten transparan seperti ini:
Kemudian dalam RelativeLayout Anda pertama-tama dapat menempatkan gambar Anda dan kemudian di lokasi yang sama di atas bentuk dengan ImageView lain. Bentuk penutup harus lebih besar ukurannya dengan jumlah lebar perbatasan. Berhati-hatilah untuk mengambil jari-jari sudut yang lebih besar karena jari-jari luar didefinisikan tetapi jari-jari dalam adalah yang menutupi gambar Anda.
Semoga ini bisa membantu seseorang juga.
Edit sesuai permintaan CQM contoh tata letak relatif:
sumber
Dimulai dengan versi
1.2.0-alpha03
dari para Bahan Komponen Perpustakaan ada yang baruShapeableImageView
.Anda dapat menggunakan sesuatu seperti:
dengan:
Atau secara terprogram:
sumber
Implementasi saya dari ImageView dengan widget sudut bulat, yang (turun ||) ukuran gambar untuk dimensi yang diperlukan. Ini menggunakan bentuk kode CaspNZ.
sumber
Sampai saat ini, ada cara lain - menggunakan API Generated Glide . Butuh beberapa pekerjaan awal tetapi kemudian memberi Anda semua kekuatan Glide dengan fleksibilitas untuk melakukan apa pun karena Anda menggeliat kode yang sebenarnya jadi saya pikir itu adalah solusi yang baik untuk jangka panjang. Plus, penggunaannya sangat sederhana dan rapi.
Pertama, siapkan Glide versi 4+:
Kemudian buat kelas modul aplikasi Glid untuk memicu pemrosesan anotasi:
Kemudian buat ekstensi Glide yang sebenarnya berfungsi. Anda dapat menyesuaikannya untuk melakukan apa pun yang Anda inginkan:
Setelah menambahkan file-file ini, bangun proyek Anda.
Kemudian gunakan dalam kode Anda seperti ini:
sumber
RequestOptions
danoptions
dalam params@GlideExtension
kelas beranotasi dan hanya pergi dengan.transform(new RoundedCorners(px))
manapx
yang sama (int px = Math.round(cornerRadius * (context.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT));
).Ada perpustakaan keren yang memungkinkan Anda untuk membentuk tampilan gambar.
Berikut ini sebuah contoh:
Definisi bentuk:
Hasil:
sumber
Berikut ini adalah contoh sederhana meng-override imageView, Anda kemudian dapat menggunakannya di desainer tata letak untuk melihat pratinjau.
Ini untuk solusi cepat. Radius digunakan di semua sudut dan didasarkan pada persentase lebar bitmap.
Saya baru saja mengganti
setImageDrawable
dan menggunakan metode dukungan v4 untuk bitmap bulat yang dapat digambar.Pemakaian:
Pratinjau dengan imageView dan custom imageView:
sumber
Anda harus memperluas
ImageView
dan menggambar persegi panjang bulat Anda sendiri.Jika Anda ingin bingkai di sekitar gambar Anda juga bisa menempatkan bingkai bulat di atas tampilan gambar di tata letak.
[Sunting] Menempatkan bingkai ke atas untuk op gambar asli, dengan menggunakan
FrameLayout
misalnya. Elemen pertamaFrameLayout
adalah gambar yang ingin Anda putar bulat. Kemudian tambahkan yang lainImageView
dengan bingkai. Yang keduaImageView
akan ditampilkan di atas yang asliImageView
dan dengan demikian Android akan menggambar isinya di atas orignalImageView
.sumber
FrameLayout
menempatkanImageView
di dalamnya dan menambahkan yang lainImageView
dengan bingkai bulat. Dengan begitu yang pertamaImageView
akan menampilkan gambar yang Anda pilih dan yang keduaImageFrame
akan menampilkan bingkai bulat.Romain Guy adalah tempatnya.
Versi yang diperkecil sebagai berikut.
sumber
Solusi xml murni ini cukup baik dalam kasus saya. http://www.techrepublic.com/article/pro-tip-round-corners-on-an-android-imageview-with-this-hack/
EDIT
Singkatnya, inilah jawabannya:
Di folder / res / drawable, buat file frame.xml. Di dalamnya, kita mendefinisikan sebuah persegi panjang sederhana dengan sudut bulat dan pusat transparan .
Di file tata letak Anda, Anda menambahkan LinearLayout yang berisi ImageView standar, serta FrameLayout bersarang. FrameLayout menggunakan padding dan custom drawable untuk memberikan ilusi sudut yang membulat.
sumber
Alat peraga untuk George Walters II di atas, saya hanya mengambil jawabannya dan sedikit memperluasnya untuk mendukung pembulatan sudut individu secara berbeda. Ini dapat dioptimalkan sedikit lebih jauh (beberapa rect target tumpang tindih), tetapi tidak banyak.
Saya tahu utas ini agak lama, tetapi ini adalah salah satu hasil teratas untuk kueri di Google untuk cara membulatkan sudut-sudut ImageViews di Android.
sumber
Terapkan bentuk ke Anda
imageView
seperti di bawah ini:mungkin bermanfaat bagi Anda teman.
sumber
Mengapa tidak melakukan kliping
draw()
?Inilah solusi saya:
Kode:
sumber
Berikut ini membuat objek tata letak persegi panjang bulat yang menarik persegi panjang bulat di sekitar objek anak yang ditempatkan di dalamnya. Itu juga menunjukkan cara membuat tampilan dan tata letak secara terprogram tanpa menggunakan tata letak file xml.
Kelas untuk objek tata letak RoundedRectangle adalah seperti yang didefinisikan di sini:
sumber
Kotlin
Untuk membuat
ImageView
Circular, kami dapat mengubahcornerRadius
dengan:sumber
Terima kasih banyak atas jawaban pertama. Berikut adalah versi yang dimodifikasi untuk mengubah gambar persegi panjang menjadi gambar persegi (dan bulat) dan mengisi warna yang dilewatkan sebagai parameter.
sumber
Jika Anda menggunakan Glide Library, ini akan sangat membantu:
sumber
jika gambar Anda ada di internet, cara terbaik adalah menggunakan glide dan
RoundedBitmapDrawableFactory
(dari API 21 - tetapi tersedia di perpustakaan dukungan) seperti:sumber
centerCrop
Anda hanya dapat menggunakan
ImageView
tata letak dan menggunakanglide
, Anda dapat menerapkan sudut bulat menggunakan metode ini.pertama di tulis gradle Anda,
untuk gambar dengan sudut bulat,
metode panggilan:
sumber
ImageView
.Jawab untuk pertanyaan yang dialihkan ke sini: "Bagaimana cara membuat ImageView melingkar di Android?"
sumber
Dengan bantuan luncur perpustakaan dan kelas RoundedBitmapDrawableFactory mudah untuk dicapai. Anda mungkin perlu membuat gambar placeholder melingkar.
sumber
Untuk yang menggunakan Glide dan Kotlin, Anda dapat mencapainya dengan memperluas
RequestBuilder
dan gunakan sebagai;
sumber
roundCorners
seperti di atas? @ Dr.aNdRO