ImageView เป็นวงกลมถึง xml


202

ฉันต้องการที่จะทำให้ภาพใด ๆ จากฉันImageViewเป็นวงกลมที่มีเส้นขอบ

ฉันค้นหา แต่ไม่พบข้อมูลที่เป็นประโยชน์ (สิ่งที่ฉันพยายามไม่ทำงาน)

ฉันจะทำสิ่งนี้ผ่าน xml: สร้างImageViewด้วย src บางอย่างและทำให้เป็นวงกลมด้วยเส้นขอบได้อย่างไร


วิธีการเปลี่ยน src ของ ImageView ในโค้ดจาวา
chenzhongpu

วิธีแก้ปัญหาที่ดีอย่างง่าย ๆ ที่นี่stackoverflow.com/a/28096369/2162226 - ทั้งหมดใน Java ดังนั้นคุณสามารถใช้การจัดรูปแบบนี้แบบไดนามิกกับภาพที่รันไทม์
Gene Bo

คุณต้องใส่ ImageView ของคุณไว้ใน CardView เพราะ CardView มีเพียงคุณสมบัติการเข้าถึงคุณลักษณะรัศมีมุม
Vahag Chakhoyan

คำตอบ:


223

คุณสามารถสร้างวงกลมอย่างง่ายที่มีเส้นขอบสีขาวและเนื้อหาโปร่งใสที่มีรูปร่าง

// res/drawable/circle.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:innerRadius="0dp"
    android:shape="ring"
    android:thicknessRatio="1.9"
    android:useLevel="false" >
    <solid android:color="@android:color/transparent" />

    <stroke
        android:width="10dp"
        android:color="@android:color/white" />
</shape>

จากนั้นสร้างรายการเลเยอร์ที่วาดได้และวางไว้เป็นพื้นหลังในมุมมองภาพของคุณ

// res/drawable/img.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:drawable="@drawable/circle"/>    
    <item android:drawable="@drawable/ic_launcher"/>

</layer-list>

และวางไว้เป็นพื้นหลังในมุมมองภาพของคุณ

   <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/img"/>

คุณจะมีอะไรแบบนั้น

ป้อนคำอธิบายรูปภาพที่นี่


13
แล้วฉันจะตั้งค่ารูปร่างนั้นเป็นพื้นหลังของมุมมองภาพของฉันหรือไม่ ฉันพยายามแล้ว แต่ไม่ได้ผล รูปภาพของฉันยังคงเป็นรูปสี่เหลี่ยมผืนผ้า :(
3050910

3
ใช่การใช้ XML เพราะการใช้รหัสจาวามีราคาแพงมากสำหรับมือถือ ด้วยรหัสนี้มันจะปรากฏเฉพาะวงกลมที่อยู่ด้านหลังรูปภาพของฉันไม่ใช่ภาพที่เป็นวงกลม ฉันเข้าใจว่าสำหรับเส้นขอบฉันต้องการให้ภาพของฉันกลมเป็นวงกลมในภาพนี้
user3050910

5
แต่ก็ยังมีบางอย่างผิดปกติ นอกจากภาพที่มีขอบวงกลมด้านหน้ามันไม่โปร่งใสนอกวงกลม ฉันหมายความว่าวงกลมอยู่ตรงนั้นอย่างไรก็ตามมุมภาพสามารถมองเห็นได้และอยู่เหนือพื้นที่วงกลมด้านหลัง
user3050910

79
วิธีการเปลี่ยน src ของ ImageView ในโค้ดจาวาถ้าฉันใช้วิธีนี้?
chenzhongpu

3
แหล่งที่มา img ไร้ประโยชน์ที่ hardcorded ฉันต้องการเปลี่ยนด้วยรหัส
user924

289

นี่เป็นวิธีที่ง่ายที่สุดที่ฉันออกแบบ ลองสิ่งนี้

dependencies: compile 'com.android.support:appcompat-v7:23.1.1'
              compile 'com.android.support:design:23.1.1'
              compile 'com.android.support:cardview-v7:23.1.1'

<android.support.v7.widget.CardView
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:elevation="12dp"
    android:id="@+id/view2"
   app:cardCornerRadius="40dp"
    android:layout_centerHorizontal="true"
    android:innerRadius="0dp"
    android:shape="ring"
    android:thicknessRatio="1.9">
    <ImageView
        android:layout_height="80dp"
        android:layout_width="match_parent"
        android:id="@+id/imageView1"
        android:src="@drawable/YOUR_IMAGE"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true">
    </ImageView>
 </android.support.v7.widget.CardView>

หากคุณกำลังทำงานกับรุ่น Android ข้างต้นอมยิ้ม

<android.support.v7.widget.CardView
android:layout_width="80dp"
android:layout_height="80dp"
android:elevation="12dp"
android:id="@+id/view2"
app:cardCornerRadius="40dp"
android:layout_centerHorizontal="true">
<ImageView
    android:layout_height="80dp"
    android:layout_width="match_parent"
    android:id="@+id/imageView1"
    android:src="@drawable/YOUR_IMAGE"
    android:scaleType="centerCrop"/>
  </android.support.v7.widget.CardView>

การเพิ่มเส้นขอบเพื่อปัด ImageView - เวอร์ชันล่าสุด

ห่อมันด้วย CardView อื่นที่ใหญ่กว่าสีด้านในเล็กน้อยและตั้งค่าสีพื้นหลังเพื่อเพิ่มเส้นขอบให้กับรูปภาพทรงกลมของคุณ คุณสามารถเพิ่มขนาดของ CardView ด้านนอกเพื่อเพิ่มความหนาของเส้นขอบ

<androidx.cardview.widget.CardView
  android:layout_width="155dp"
  android:layout_height="155dp"
  app:cardCornerRadius="250dp"
  app:cardBackgroundColor="@color/white">

    <androidx.cardview.widget.CardView
      android:layout_width="150dp"
      android:layout_height="150dp"
      app:cardCornerRadius="250dp"
      android:layout_gravity="center">

        <ImageView
          android:layout_width="150dp"
          android:layout_height="150dp"
          android:src="@drawable/default_user"
          android:scaleType="centerCrop"/>

   </androidx.cardview.widget.CardView>

 </androidx.cardview.widget.CardView>

1
ขอบคุณสำหรับสิ่งนี้. ง่ายและใช้งานหน่วยความจำง่าย ไลบรารี่ที่ฉันได้ลองมาทั้งหมดให้ OOMExceptions เมื่อใช้มุมมองกำหนดเองในรายการ RecyclerView
COBB

11
พยายามใช้สิ่งนี้ดูเหมือนว่ามันจะไม่ทำงานกับ Android ต่ำกว่า 5.0 แม้ว่ามุมมองภาพจะเป็นแบบวงกลม แต่ภาพก็เล็กลงด้วยรูปสี่เหลี่ยม ข้อเสนอแนะใด ๆ 5.0 ขึ้นไปใช้งานได้ดี
Kaps

6
ภาพของฉันไม่พอดีกับ CardView ด้วยวิธีนี้
Hendra Anggrian

21
สิ่งนี้ทำให้มุมมองการ์ดกลม แต่ภาพยังคงเป็นรูปสี่เหลี่ยมด้านล่าง
kabuto178

5
ขอบคุณคีย์ที่นี่คือรัศมีบัตรต้องเป็นครึ่งหนึ่งของความกว้างและความสูงเพื่อให้เป็นวงกลมที่เหมาะสม
B.shruti

125

ฉันหวังว่านี่จะช่วยคุณได้

1) CircleImageView

ป้อนคำอธิบายรูปภาพที่นี่

 <de.hdodenhof.circleimageview.CircleImageView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/profile_image"
    android:layout_width="96dp"
    android:layout_height="96dp"
    android:src="@drawable/profile"
    app:civ_border_width="2dp"
    app:civ_border_color="#FF000000"/>

อย่าลืมการนำไปใช้: สคริปต์การไล่ระดับ> build.gradle (โมดูล: แอป)> การอ้างอิง

     implementation 'de.hdodenhof:circleimageview:3.1.0'   

สำหรับคำอธิบายที่สมบูรณ์โปรดตรวจสอบที่นี่: แหล่งที่มา

2) CircularImageView

ป้อนคำอธิบายรูปภาพที่นี่

<com.mikhaellopez.circularimageview.CircularImageView
    android:layout_width="250dp"
    android:layout_height="250dp"
    android:src="@drawable/image"
    app:civ_border_color="#3f51b5"
    app:civ_border_width="4dp"
    app:civ_shadow="true"
    app:civ_shadow_radius="10"
    app:civ_shadow_color="#3f51b5"/>

อย่าลืมการนำไปใช้: สคริปต์การไล่ระดับ> build.gradle (โมดูล: แอป)> การอ้างอิง

     implementation 'com.mikhaellopez:circularimageview:4.2.0'   

สำหรับคำอธิบายที่สมบูรณ์โปรดตรวจสอบที่นี่: แหล่งที่มา


1
จะเปลี่ยนสีเทาให้เป็นสีขาวได้อย่างไร?
John Joe

2
มีการอัปเดตตั้งแต่โพสต์สิ่งนี้ border_colour และ border_width ได้รับการเปลี่ยนชื่อ ตรวจสอบหน้า github สำหรับข้อมูลเพิ่มเติม: github.com/hdodenhof/CircleImageView
rharvey

ไม่รองรับประเภทเครื่องชั่ง :(
Khan

สวัสดีมันทำงานได้ดีเมื่อตั้งค่าด้วย src แต่ลักษณะการทำงานนั้นแตกต่างกันเมื่อพยายามตั้งค่าโดยใช้รหัส java
Erum

@Erum คุณต้องใส่คอมไพล์ 'de.hdodenhof: circleimageview: 1.3.0' ในไฟล์ gradle ไม่จำเป็นต้องใช้รหัส java
Sanjay Mangaroliya

48

ด้วยความช่วยเหลือของร่อนไลบรารี่และคลาสRoundedBitmapDrawableFactoryมันง่ายที่จะบรรลุ คุณอาจต้องสร้างภาพตัวยึดแบบวงกลม

ร่อน V4:

Glide.with(context).load(url).apply(RequestOptions.circleCropTransform()).into(imageView);

ร่อน V3:

    Glide.with(context)
        .load(imgUrl)
        .asBitmap()
        .placeholder(R.drawable.placeholder)
        .error(R.drawable.placeholder)
        .into(new BitmapImageViewTarget(imgProfilePicture) {
            @Override
            protected void setResource(Bitmap resource) {
                RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(context.getResources(),
                        Bitmap.createScaledBitmap(resource, 50, 50, false));
                drawable.setCircular(true);
                imgProfilePicture.setImageDrawable(drawable);
            }
        });

สำหรับPicasso RoundedTransformนี่เป็นคำตอบที่ยอดเยี่ยมมากที่ให้ตัวเลือกเพิ่มเติมสำหรับการปัดภาพที่ขอบด้านบนหรือด้านล่าง


2
ไม่แน่ใจว่าคุณใช้ร่อนรุ่นใดสำหรับตัวอย่างนี้ แต่ด้วย v4.0.0 คุณสามารถใช้ RequestOptions แทน RoundedBitmapDrawable: Glide.with(context).load(imgUrl).apply(new RequestOptions().centerCrop()) .into(imageView)
Eugene Brusov

2
คุณไม่ได้หมายความว่า; Glide.with (context) .load (imgUrl) .apply (ใหม่ RequestOptions (). circleCrop ()) .into (imageView)?
Androidz

3
กับรุ่น 4.6.1 ใช้.apply(RequestOptions.circleCropTransform())
พาเวล

2
ในฉุยฉาย v.4 ถ้ามีการกำหนดค่าในโปรแกรมประยุกต์:GlideApp GlideApp.with(this).load(url).circleCrop().into(imageView);
CoolMind

1
ฉันไม่อยากจะเชื่อเลยว่ามันจะทำงานได้อย่างง่ายดายหากไม่มีหัวหน้า
Ajeeli

30

วิธีการด้านบนดูเหมือนจะไม่ทำงานหากคุณใช้srcคุณลักษณะ สิ่งที่ฉันทำคือใส่มุมมองภาพสองแบบไว้ในเลย์เอาต์เฟรมด้านบนอีกมุมมองดังนี้:

<FrameLayout android:id="@+id/frame"
             android:layout_width="40dp"
             android:layout_height="40dp">

    <ImageView android:id="@+id/pic"
               android:layout_width="40dp"
               android:layout_height="40dp"
               android:src="@drawable/my_picture" />

    <ImageView android:id="@+id/circle_crop"
               android:layout_width="40dp"
               android:layout_height="40dp"
               android:src="@drawable/circle_crop" />

</FrameLayout>

เพียงแค่ใส่ circular_crop.png ในโฟลเดอร์ drawable ของคุณซึ่งอยู่ในรูปร่างของขนาดภาพของคุณ (รูปสี่เหลี่ยมในกรณีของฉัน) ที่มีพื้นหลังสีขาวและวงกลมโปร่งใสอยู่ตรงกลาง คุณสามารถใช้ภาพนี้หากคุณต้องการภาพมุมมองสี่เหลี่ยม

ภาพรอบ

เพียงดาวน์โหลดภาพด้านบน


2
ทางออกที่ดีที่สุด! ประสิทธิภาพที่ดีที่สุด. เปลี่ยนบิตแมปเป็นปัญหาหน่วยความจำ
itzhar

ภาพตัวอย่างนี้เป็นสีขาวใช่แล้ว แต่คุณสามารถสร้างภาพของคุณเองในสีใด ๆ หรือดาวน์โหลดภาพนี้และเพียงแค่เปลี่ยนสี
Jyotman Singh

คุณช่วยอธิบายได้ฉันจะเปลี่ยนสีของภาพเป็นสีดำได้อย่างไร ก็สามารถทำได้จากภายใน Android สตูดิโอหรือฉันจะต้องเป็นเครื่องมือภายนอก (หนึ่งจะเห็นฉันไม่คุ้นเคยกับการสร้างภาพ)
ซวี่

ไม่มีจากใน Android Studio คุณต้องการอะไรที่เหมือนกับ Photoshop รูปนี้เองก็ถูกสร้างขึ้นด้วย photoshop
Jyotman Singh

1
คุณสามารถให้ฟิลเตอร์สีวาดวงกลมได้: circleCrop.setColorFilter (getResources (). getColor (R.color.white)) ด้วยวิธีนี้คุณสามารถมีวงกลมวงเดียววาดสีใด ๆ และนำมาใช้ใหม่ได้ทุกที่ในแอปของคุณบนพื้นหลังใด ๆ เพียงตั้งค่าตัวกรองสีด้วยทรัพยากรสีที่เหมาะสมในแต่ละครั้ง
mjp66

19

ต่อไปนี้เป็นวิธีที่ง่ายที่สุดวิธีหนึ่งในการใช้รหัสต่อไปนี้:

การอ้างอิง

dependencies {
    ...
    compile 'de.hdodenhof:circleimageview:2.1.0'      // use this or use the latest compile version. In case u get bug.
}

รหัส XML

<de.hdodenhof.circleimageview.CircleImageView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/profile_image"
    android:layout_width="96dp"             //  here u can adjust the width 
    android:layout_height="96dp"            //  here u can adjust the height 
    android:src="@drawable/profile"         //  here u can change the image 
    app:civ_border_width="2dp"              //  here u can adjust the border of the circle.  
    app:civ_border_color="#FF000000"/>      //  here u can adjust the border color

ภาพหน้าจอ:

ภาพหน้าจอ

ที่มา: Circular ImageView GitHub Repository

ป้อนคำอธิบายรูปภาพที่นี่


6
ไม่รองรับประเภทเครื่องชั่ง :(
Khan

8

เพียงใช้สิ่งที่ShapeableImageViewจัดทำโดยไลบรารีส่วนประกอบวัสดุ
Somethig ชอบ:

<com.google.android.material.imageview.ShapeableImageView
    app:shapeAppearanceOverlay="@style/roundedImageViewRounded"
    app:strokeColor="@color/....."
    app:strokeWidth="1dp"
    ...
    />

ด้วย:

  <style name="roundedImageViewRounded">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">50%</item>
  </style>

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ:1.2.0-alpha03มันต้องมีอย่างน้อยรุ่น


6

นี่จะเป็นการหลอกลวง:

rectangle.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/transparent" />
    <padding android:bottom="-14dp" android:left="-14dp" android:right="-14dp" android:top="-14dp" />

</shape>

circle.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:innerRadius="0dp"
    android:shape="oval"

    android:useLevel="false" >
    <solid android:color="@android:color/transparent" />

    <stroke
        android:width="15dp"
        android:color="@color/verification_contact_background" />

</shape>

profile_image.xml (เลเยอร์รายการ)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:drawable="@drawable/rectangle" />
    <item android:drawable="@drawable/circle"/>

</layer-list>

เค้าโครงของคุณ

 <ImageView
        android:id="@+id/profile_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/default_org"
        android:src="@drawable/profile_image"/>

default_org คืออะไร
John Joe

นี่สามารถเป็นภาพตัวแทนได้
Nidhi

ในกรณีนี้ขอบของรูปภาพในมิติสี่เหลี่ยมจะข้ามขอบเขตของวงกลม ฉันจะวางตำแหน่งแต่ละภาพในทุกมิติและทุกรูปแบบได้อย่างไรภายในวงกลม
inverted_index

5

คุณสามารถใช้ CardView โดยไม่ต้องมีไลบรารีภายนอก

  <androidx.cardview.widget.CardView
                    android:id="@+id/roundCardView"
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:layout_centerHorizontal="true"
                    android:elevation="0dp"
                    app:cardCornerRadius="20dp">

                    <ImageView
                        android:layout_width="40dp"
                        android:layout_height="40dp"
                        android:src="@drawable/profile" />
</androidx.cardview.widget.CardView>

4

ฉันใช้รูปร่าง = "วงรี" แทน "แหวน" ด้านล่าง มันได้ผลสำหรับฉัน เพื่อให้ภาพที่อยู่ในขอบเขตที่ผมใช้<padding>และการตั้งค่าให้เป็นจริงในของฉัน<adjustViewBounds> <ImageView>ฉันลองด้วยขนาดภาพระหว่าง 50 x 50 px มากถึง 200x200 px


คุณสามารถเพิ่มรายการต่อไปนี้ได้เช่นกันandroid:scaleType="fitCenter"
ihayet

2

@Jyotman Singh คำตอบนั้นดีมาก (สำหรับพื้นหลังที่แข็ง) ดังนั้นฉันจึงอยากจะปรับปรุงมันด้วยการแชร์เวกเตอร์ที่วาดได้ซึ่งสามารถเปลี่ยนสีได้ตามความต้องการของคุณอีกทั้งยังสะดวกเนื่องจากเวกเตอร์รูปร่างชิ้นเดียวสามารถปรับขนาดได้

นี่คือรูปสี่เหลี่ยมผืนผ้าวงกลม (@ drawable / shape_round_profile_pic):

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:viewportWidth="284"
    android:viewportHeight="284"
    android:width="284dp"
    android:height="284dp">
    <path
        android:pathData="M0 142L0 0l142 0 142 0 0 142 0 142 -142 0 -142 0zm165 137.34231c26.06742 -4.1212 52.67405 -17.543 72.66855 -36.65787 11.82805 -11.30768 20.55487 -22.85153 27.7633 -36.72531C290.23789 158.21592 285.62874 101.14121 253.48951 58.078079 217.58149 9.9651706 154.68849 -10.125717 98.348685 8.5190299 48.695824 24.95084 12.527764 67.047123 3.437787 118.98655 1.4806194 130.16966 1.511302 152.96723 3.4990422 164.5 12.168375 214.79902 47.646316 256.70775 96 273.76783c21.72002 7.66322 44.26673 9.48476 69 5.57448z"
        android:fillColor="#ffffff" /> // you can change frame color
</vector>

การใช้งานเหมือนกัน:

<FrameLayout
        android:layout_width="70dp"
        android:layout_height="70dp">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/YOUR_PICTURE" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/shape_round_profile_pic"/>

    </FrameLayout>

และสิ่งนี้ควรจะทำงานอย่างไร คุณเพียงแค่แสดงวงกลมเหนือภาพในขณะที่สิ่งที่ถามจริงคือวิธีการครอบตัดรูปภาพดังนั้นมันจะมีลักษณะเป็นวงกลม
Fattum

โปรดดูคำตอบของ @Jyotman Singh ด้านบน มันเป็นประโยชน์สำหรับฉันดังนั้นฉันปรับปรุงมันเล็กน้อย ในการครอบตัดรูปภาพคุณสามารถใช้:GlideApp.with(getApplicationContext()).asBitmap().load(profilePhotoUrl) .circleCrop()
ekar

ขอบคุณสำหรับรูปทรงวงกลมในสี่เหลี่ยมผืนผ้า! สิ่งที่ฉันต้องการ!
siralexsir88

2

เพียงใช้บรรทัดของรหัสเหล่านี้และคุณทำเสร็จแล้ว:

<de.hdodenhof.circleimageview.CircleImageView
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:clickable="true"
            app:civ_border_width="3dp"
            app:civ_border_color="#FFFFFFFF"
            android:id="@+id/profile"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_below="@+id/header_cover_image"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="-130dp"
            android:elevation="5dp"
            android:padding="20dp"
            android:scaleType="centerCrop"
            android:src="@drawable/profilemain" />

ป้อนคำอธิบายรูปภาพที่นี่

อย่าลืมนำเข้า:

import de.hdodenhof.circleimageview.CircleImageView;

เพิ่มห้องสมุดนี้ใน build.gradle:

compile 'de.hdodenhof:circleimageview:2.1.0'

คุณจะต้องหายไปบางสิ่งบางอย่างในคลาสจาวา
John Joe

1

ลองสิ่งนี้

public class RoundedImageView extends android.support.v7.widget.AppCompatImageView {

    private int borderWidth = 4;
    private int viewWidth;
    private int viewHeight;
    private Bitmap image;
    private Paint paint;
    private Paint paintBorder;
    private BitmapShader shader;

    public RoundedImageView(Context context)
    {
        super(context);
        setup();
    }

    public RoundedImageView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        setup();
    }

    public RoundedImageView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        setup();
    }

    private void setup()
    {
        paint = new Paint();
        paint.setAntiAlias(true);

        paintBorder = new Paint();
        setBorderColor(Color.WHITE);
        paintBorder.setAntiAlias(true);
        this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);

        paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.WHITE);
    }

    public void setBorderWidth(int borderWidth)
    {
        this.borderWidth = borderWidth;
        this.invalidate();
    }

    public void setBorderColor(int borderColor)
    {
        if (paintBorder != null)
            paintBorder.setColor(borderColor);

        this.invalidate();
    }

    private void loadBitmap()
    {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable();

        if (bitmapDrawable != null)
            image = bitmapDrawable.getBitmap();
    }

    @SuppressLint("DrawAllocation")
    @Override
    public void onDraw(Canvas canvas)
    {
        loadBitmap();

        if (image != null)
        {
            shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            paint.setShader(shader);
            int circleCenter = viewWidth / 2;
            canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth - 4.0f, paintBorder);
            canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter - 4.0f, paint);
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int width = measureWidth(widthMeasureSpec);
        int height = measureHeight(heightMeasureSpec, widthMeasureSpec);

        viewWidth = width - (borderWidth * 2);
        viewHeight = height - (borderWidth * 2);

        setMeasuredDimension(width, height);
    }

    private int measureWidth(int measureSpec)
    {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        if (specMode == MeasureSpec.EXACTLY)
        {
            result = specSize;
        }
        else
        {
            // Measure the text
            result = viewWidth;
        }

        return result;
    }

    private int measureHeight(int measureSpecHeight, int measureSpecWidth)
    {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpecHeight);
        int specSize = MeasureSpec.getSize(measureSpecHeight);

        if (specMode == MeasureSpec.EXACTLY)
        {
            result = specSize;
        }
        else
        {
            result = viewHeight;
        }

        return (result + 2);
     }
 }

และใช้ ImageView นี้ในเลย์เอาต์เช่น:

<com.app.Demo.RoundedImageView
     android:id="@+id/iv_profileImage"
     android:layout_width="70dp"
     android:layout_height="70dp"
     android:layout_centerHorizontal="true"
    />

1

หากคุณใช้การออกแบบวัสดุในแอปของคุณให้ใช้สิ่งนี้

<com.google.android.material.card.MaterialCardView
            android:layout_width="75dp"
            android:layout_height="75dp"
            app:cardCornerRadius="50dp"
            app:strokeWidth="1dp"
            app:strokeColor="@color/black">
            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/circular_image"
                android:scaleType="fitCenter"
                android:src="@drawable/your_img" />
        </com.google.android.material.card.MaterialCardView>

0

คลาสนี้เป็นมุมมอง Circular แบบกำหนดเองที่มีเงาจังหวะความอิ่มตัวและการใช้ Image Circular แบบกำหนดเองนี้คุณสามารถทำให้ภาพของคุณเป็นรูปวงกลมด้วยรัศมี Guys for Circular Shadow ImageView ไม่จำเป็นต้อง GitHub ระดับนี้ก็เพียงพอ

เพิ่ม CircularImageView ให้กับเลย์เอาต์ของคุณ

CircularImageView c=new CircularImageView(this,screen width,screen height,Bitmap myimage);
yourLayout.addView(c);**


public class CircularImageView extends android.support.v7.widget.AppCompatImageView  
{
    private final Context context;
    private final int width, height;
    private final Paint paint;
    private final Paint paintBorder,imagePaint;
    private final Bitmap bitmap2;
    private final Paint paint3;
    private Bitmap bitmap;
    private BitmapShader shader;
    private float radius = 4.0f;
    float x = 0.0f;
    float y = 8.0f;
    private float stroke;
    private float strokeWidth = 0.0f;
    private Bitmap bitmap3;
    private int corner_radius=50;


    public CircularImageView(Context context, int width, int height, Bitmap bitmap)     {
        super(context);
        this.context = context;
        this.width = width;
        this.height = height;

   //here "bitmap" is the square shape(width* width) scaled bitmap ..

        this.bitmap = bitmap;


        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setAntiAlias(true);
        paint.setFilterBitmap(true);
        paint.setDither(true);


        paint3=new Paint();
        paint3.setStyle(Paint.Style.STROKE);
        paint3.setColor(Color.WHITE);
        paint3.setAntiAlias(true);

        paintBorder = new Paint();
        imagePaint= new Paint();

        paintBorder.setColor(Color.WHITE);
        paintBorder.setAntiAlias(true);
        this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);


        this.bitmap2 = Bitmap.createScaledBitmap(bitmap, (bitmap.getWidth() - 40), (bitmap.getHeight() - 40), true);


        imagePaint.setAntiAlias(true);




        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) 
    {
        super.onDraw(canvas);
        Shader b;
         if (bitmap3 != null)
            b = new BitmapShader(bitmap3, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
         else
            b = new BitmapShader(bitmap2, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        imagePaint.setShader(b);
        canvas.drawBitmap(maskedBitmap(), 20, 20, null);
    }

    private Bitmap maskedBitmap()
    {
        Bitmap l1 = Bitmap.createBitmap(width,width, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(l1);
        paintBorder.setShadowLayer(radius, x, y, Color.parseColor("#454645"));
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        final RectF rect = new RectF();
        rect.set(20, 20, bitmap2.getWidth(), bitmap2.getHeight());

        canvas.drawRoundRect(rect, corner_radius, corner_radius, paintBorder);

        canvas.drawRoundRect(rect, corner_radius, corner_radius, imagePaint);

        if (strokeWidth!=0.0f)
        {
            paint3.setStrokeWidth(strokeWidth);
            canvas.drawRoundRect(rect, corner_radius, corner_radius, paint3);
        }

         paint.setXfermode(null);
        return l1;
    }




     // use seekbar here, here you have to pass  "0 -- 250"  here corner radius will change 

    public void setCornerRadius(int corner_radius)
    {
        this.corner_radius = corner_radius;
        invalidate();
    }



    -------->use seekbar here, here you have to pass  "0 -- 10.0f"  here shadow radius will change 

    public void setShadow(float radius)
    {
        this.radius = radius;
        invalidate();
    }

   // use seekbar here, here you have to pass  "0 -- 10.0f"  here stroke size  will change 

    public void setStroke(float stroke)
    {
        this.strokeWidth = stroke;
        invalidate();
    }

    private Bitmap updateSat(Bitmap src, float settingSat)
    {

        int w = src.getWidth();
        int h = src.getHeight();

        Bitmap bitmapResult =
                Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas canvasResult = new Canvas(bitmapResult);
        Paint paint = new Paint();
        ColorMatrix colorMatrix = new ColorMatrix();
        colorMatrix.setSaturation(settingSat);
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
        paint.setColorFilter(filter);
        canvasResult.drawBitmap(src, 0, 0, paint);

        return bitmapResult;
    }




  // use seekbar here, here you have to pass  "0 -- 2.0f"  here saturation  will change 

    public void setSaturation(float sat)
    {
        System.out.println("qqqqqqqqqq            "+sat);
        bitmap3=updateSat(bitmap2, sat);

        invalidate();
    } 


}






        // Seekbar to change radius

                  radius_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                        @Override
                        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
                        {
                            text_radius.setText(""+progress);
                            circularImageView.setCornerRadius(progress);
                        }

                        @Override
                        public void onStartTrackingTouch(SeekBar seekBar) {

                        }

                        @Override
                        public void onStopTrackingTouch(SeekBar seekBar) {

                        }
                    });


     // Seekbar to change shadow

                    shadow_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                        @Override
                        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
                        {
                            float f= 4+progress/10.0f;
                            text_shadow.setText(""+progress);
                            circularImageView.setShadow(f);
                        }

                        @Override
                        public void onStartTrackingTouch(SeekBar seekBar) {

                        }

                        @Override
                        public void onStopTrackingTouch(SeekBar seekBar) {

                        }
                    });


           // Seekbar to change saturation

                    saturation_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                        @Override
                        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
                        {
                            int progressSat = saturation_seekbar.getProgress();
                            float sat = (float) ((progressSat*4 / 100.0f)-1.0f);
                            circularImageView.setSaturation(sat);

                            text_saturation.setText(""+progressSat);
                        }

                        @Override
                        public void onStartTrackingTouch(SeekBar seekBar) {

                        }

                        @Override
                        public void onStopTrackingTouch(SeekBar seekBar) {

                        }
                    });


    // Seekbar to change stroke

                    stroke_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                        @Override
                        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
                        {
                            if (progress==0)
                            {
                                float f=(progress*10.0f/100.0f);
                                circularImageView.setStroke(f);
                            }
                            else
                            {
                                float f=(progress*10.0f/100.0f);
                                circularImageView.setStroke(f);
                            }

                            text_stroke.setText(""+progress);
                        }

                        @Override
                        public void onStartTrackingTouch(SeekBar seekBar) {

                        }

                        @Override
                        public void onStopTrackingTouch(SeekBar seekBar) {

                        }
                    });




             //radius seekbar in xml file

             <SeekBar
                android:layout_width="match_parent"
                android:layout_gravity="center" 
                android:progress="50"
                android:max="250"
                android:id="@+id/radius_seekbar"
                android:layout_height="wrap_content" />





          //saturation seekbar in xml file

             <SeekBar
                android:layout_width="match_parent"
                android:layout_gravity="center" 
                android:progress="50"
                android:max="100"
                android:id="@+id/saturation_seekbar"
                android:layout_height="wrap_content" />





    //shadow seekbar in xml file

             <SeekBar
                android:layout_width="match_parent"
                android:layout_gravity="center" 
                android:progress="0"
                android:max="100"
                android:id="@+id/shadow_seekbar"
                android:layout_height="wrap_content" />




         //stroke seekbar in xml file

             <SeekBar
                android:layout_width="match_parent"
                android:layout_gravity="center" 
                android:progress="0"
                android:max="100"
                android:id="@+id/stroke _seekbar"
                android:layout_height="wrap_content" />

0

ที่จริงแล้วคุณสามารถใช้สิ่งที่ Google มีให้ผ่านห้องสมุดสนับสนุน RoundedBitmapDrawableFactory class ( ที่นี่และที่นี่ ) แทนที่จะใช้ห้องสมุดบุคคลที่สาม:

Gradle:

implementation 'androidx.appcompat:appcompat:1.0.0-beta01'

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val originalDrawable = ContextCompat.getDrawable(this, R.drawable.avatar_1)!!
        val bitmap = convertDrawableToBitmap(originalDrawable)
        val drawable = RoundedBitmapDrawableFactory.create(resources, bitmap)
        drawable.setAntiAlias(true)
        drawable.cornerRadius = Math.max(bitmap.width, bitmap.height) / 2.0f
        avatarImageView.setImageDrawable(drawable)
    }

    companion object {
        @JvmStatic
        fun convertDrawableToBitmap(drawable: Drawable): Bitmap {
            if (drawable is BitmapDrawable)
                return drawable.bitmap
            // We ask for the bounds if they have been set as they would be most
            // correct, then we check we are  > 0
            val bounds = drawable.bounds
            val width = if (!bounds.isEmpty) bounds.width() else drawable.intrinsicWidth
            val height = if (!bounds.isEmpty) bounds.height() else drawable.intrinsicHeight
            // Now we check we are > 0
            val bitmap = Bitmap.createBitmap(if (width <= 0) 1 else width, if (height <= 0) 1 else height,
                    Bitmap.Config.ARGB_8888)
            val canvas = Canvas(bitmap)
            drawable.setBounds(0, 0, canvas.width, canvas.height)
            drawable.draw(canvas)
            return bitmap
        }
    }
}

ความละเอียด / รูปแบบ / activity_main.xml

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/avatarImageView" android:layout_width="100dp" android:layout_height="100dp"
        android:layout_gravity="center"/>

</FrameLayout>

ความละเอียด / drawable / avatar_1.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="128dp" android:height="128dp"
        android:viewportHeight="128.0" android:viewportWidth="128.0">
    <path
        android:fillColor="#FF8A80" android:pathData="M0 0h128v128h-128z"/>
    <path
        android:fillColor="#FFE0B2"
        android:pathData="M36.3 94.8c6.4 7.3 16.2 12.1 27.3 12.4 10.7,-.3 20.3,-4.7 26.7,-11.6l.2.1c-17,-13.3,-12.9,-23.4,-8.5,-28.6 1.3,-1.2 2.8,-2.5 4.4,-3.9l13.1,-11c1.5,-1.2 2.6,-3 2.9,-5.1.6,-4.4,-2.5,-8.4,-6.9,-9.1,-1.5,-.2,-3 0,-4.3.6,-.3,-1.3,-.4,-2.7,-1.6,-3.5,-1.4,-.9,-2.8,-1.7,-4.2,-2.5,-7.1,-3.9,-14.9,-6.6,-23,-7.9,-5.4,-.9,-11,-1.2,-16.1.7,-3.3 1.2,-6.1 3.2,-8.7 5.6,-1.3 1.2,-2.5 2.4,-3.7 3.7l-1.8 1.9c-.3.3,-.5.6,-.8.8,-.1.1,-.2 0,-.4.2.1.2.1.5.1.6,-1,-.3,-2.1,-.4,-3.2,-.2,-4.4.6,-7.5 4.7,-6.9 9.1.3 2.1 1.3 3.8 2.8 5.1l11 9.3c1.8 1.5 3.3 3.8 4.6 5.7 1.5 2.3 2.8 4.9 3.5 7.6 1.7 6.8,-.8 13.4,-5.4 18.4,-.5.6,-1.1 1,-1.4 1.7,-.2.6,-.4 1.3,-.6 2,-.4 1.5,-.5 3.1,-.3 4.6.4 3.1 1.8 6.1 4.1 8.2 3.3 3 8 4 12.4 4.5 5.2.6 10.5.7 15.7.2 4.5,-.4 9.1,-1.2 13,-3.4 5.6,-3.1 9.6,-8.9 10.5,-15.2m-14.4,-49.8c.9 0 1.6.7 1.6 1.6 0 .9,-.7 1.6,-1.6 1.6,-.9 0,-1.6,-.7,-1.6,-1.6,-.1,-.9.7,-1.6 1.6,-1.6zm-25.7 0c.9 0 1.6.7 1.6 1.6 0 .9,-.7 1.6,-1.6 1.6,-.9 0,-1.6,-.7,-1.6,-1.6,-.1,-.9.7,-1.6 1.6,-1.6z"/>
    <path
        android:fillColor="#E0F7FA"
        android:pathData="M105.3 106.1c-.9,-1.3,-1.3,-1.9,-1.3,-1.9l-.2,-.3c-.6,-.9,-1.2,-1.7,-1.9,-2.4,-3.2,-3.5,-7.3,-5.4,-11.4,-5.7 0 0 .1 0 .1.1l-.2,-.1c-6.4 6.9,-16 11.3,-26.7 11.6,-11.2,-.3,-21.1,-5.1,-27.5,-12.6,-.1.2,-.2.4,-.2.5,-3.1.9,-6 2.7,-8.4 5.4l-.2.2s-.5.6,-1.5 1.7c-.9 1.1,-2.2 2.6,-3.7 4.5,-3.1 3.9,-7.2 9.5,-11.7 16.6,-.9 1.4,-1.7 2.8,-2.6 4.3h109.6c-3.4,-7.1,-6.5,-12.8,-8.9,-16.9,-1.5,-2.2,-2.6,-3.8,-3.3,-5z"/>
    <path
        android:fillColor="#444" android:pathData="M76.3,47.5 m-2.0, 0 a 2.0,2.0 0 1,1 4.0,0 a2.0,2.0 0 1,1 -4.0,0"/>
    <path
        android:fillColor="#444" android:pathData="M50.7,47.6 m-2.0, 0 a 2.0,2.0 0 1,1 4.0,0 a2.0,2.0 0 1,1 -4.0,0"/>
    <path
        android:fillColor="#444"
        android:pathData="M48.1 27.4c4.5 5.9 15.5 12.1 42.4 8.4,-2.2,-6.9,-6.8,-12.6,-12.6,-16.4 17.2 1.5 14.1,-9.4 14.1,-9.4,-1.4 5.5,-11.1 4.4,-11.1 4.4h-18.8c-1.7,-.1,-3.4 0,-5.2.3,-12.8 1.8,-22.6 11.1,-25.7 22.9 10.6,-1.9 15.3,-7.6 16.9,-10.2z"/>
</vector>

ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่

และสมมติว่าคุณต้องการเพิ่มเส้นขอบด้านบนคุณสามารถใช้เส้นขอบนี้ตัวอย่างเช่น:

stroke_drawable.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <stroke
        android:width="4dp" android:color="@android:color/black"/>
</shape>

และเพิ่มandroid:foreground="@drawable/stroke_drawable"ไปยัง ImageView ในไฟล์ XML ของเลย์เอาต์และคุณจะได้รับสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่แน่ใจว่าจะเพิ่มเงาได้อย่างไร (จะใช้กับ Android รุ่นเก่ากว่า) ได้ การใช้FloatingActionButton (จากการพึ่งพา "com.google.android.material: material" ) ฉันไม่สามารถทำบิตแมปเติม FAB ได้ การใช้งานแทนจะดียิ่งขึ้นถ้าใช้งานได้


แก้ไข: หากคุณต้องการเพิ่มเงาของระดับความสูง (พร้อมใช้งานจาก API 21) คุณสามารถเปลี่ยนสิ่งที่ฉันเขียน:

ภายในไฟล์ XML เลย์เอาต์:

<androidx.appcompat.widget.AppCompatImageView android:padding="4dp"
    android:id="@+id/avatarImageView" android:layout_width="100dp" android:layout_height="100dp" android:elevation="8dp"
    android:layout_gravity="center" android:background="@drawable/stroke_drawable" tools:srcCompat="@drawable/avatar_1"/>

CircularShadowViewOutlineProvider.kt

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
class CircularShadowViewOutlineProvider : ViewOutlineProvider() {
    override fun getOutline(view: View, outline: Outline) {
        val size = Math.max(view.width, view.height)
        outline.setRoundRect(0, 0, size, size, size / 2f)
    }
}

ในรหัส:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        avatarImageView.outlineProvider = CircularShadowViewOutlineProvider()

ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่


0

ฉันมีทางออกที่ง่าย สร้างเนื้อหารูปภาพใหม่โดยคลิกขวาที่ชื่อแพ็คเกจและเลือกใหม่ -> เนื้อหารูปภาพ ป้อนชื่อ (ชื่อใด ๆ ) และเส้นทาง (ตำแหน่งของภาพในระบบของคุณ) จากนั้นคลิกถัดไปและเสร็จสิ้น หากคุณป้อนชื่อของภาพเป็น 'img' รูปภาพกลมที่มีชื่อ 'img_round' จะถูกสร้างขึ้นโดยอัตโนมัติในโฟลเดอร์ mipmap

จากนั้นทำสิ่งนี้:

<ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@mipmap/img_round"/>

ตัวอย่างของคุณอาจยังคงแสดงเป็นรูปสี่เหลี่ยมผืนผ้า แต่ถ้าคุณเรียกใช้แอพบนอุปกรณ์ของคุณมันจะเป็นแบบกลม


0

สร้าง CustomImageview จากนั้นก็แทนที่onDraw()วิธีการดังต่อไปนี้:

@Override
protected void onDraw(Canvas canvas) {

    float radius = this.getHeight()/2;
    Path path = new Path();
    RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight());
    path.addRoundRect(rect, radius, radius, Path.Direction.CW);
    canvas.clipPath(path);
    super.onDraw(canvas);

}

ในกรณีที่คุณต้องการรหัสสำหรับวิดเจ็ตที่กำหนดเองเช่นกัน: -

CircularImageView.java

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

import androidx.annotation.Nullable;

public class CircularImageView extends ImageView {

    private Drawable image;

    public CircularImageView(Context context) {
        super(context);

        init(null, 0);
    }

    public CircularImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        init(attrs, 0);
    }

    public CircularImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        init(attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        float radius = this.getHeight()/2;
        Path path = new Path();
        RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight());
        path.addRoundRect(rect, radius, radius, Path.Direction.CW);
        canvas.clipPath(path);
        super.onDraw(canvas);

    }

    private void init(AttributeSet attrs, int defStyle) {
        TypedArray a = Utils.CONTEXT.getTheme().obtainStyledAttributes(attrs, R.styleable.CircularImageView, 0, 0);
        try {
            image = a.getDrawable(R.styleable.CircularImageView_src);
        } finally {
            a.recycle();
        }

        this.setImageDrawable(image);
    }
}

นอกจากนี้ให้เพิ่มรหัสต่อไปนี้ใน res / attrs.xmlเพื่อสร้างคุณสมบัติที่ต้องการ: -

<declare-styleable name="CircularImageView">
        <attr name="src" format="reference" />
</declare-styleable>

สิ่งนี้จะใช้งานได้เมื่อมุมมองภาพไม่มีพื้นหลัง ถ้าอย่างนั้นจะทำอย่างไร?
Supradip.M

0
if you want to set edit icon on to circle imageview than put this below code.

 <FrameLayout
                android:layout_width="@dimen/_100sdp"
                android:layout_height="@dimen/_100sdp"
                android:layout_gravity="center"
                android:layout_marginTop="10dp">

                <de.hdodenhof.circleimageview.CircleImageView
                    android:id="@+id/profilePic"
                    android:layout_width="@dimen/_100sdp"
                    android:layout_height="@dimen/_100sdp"
                    android:layout_gravity="bottom|center_horizontal"
                    android:src="@drawable/ic_upload" />

                <de.hdodenhof.circleimageview.CircleImageView
                    android:id="@+id/iv_camera"
                    android:layout_width="@dimen/_30sdp"
                    android:layout_height="@dimen/_30sdp"
                    android:layout_gravity="top|right"
                    android:src="@drawable/edit"/>
            </FrameLayout>

0

หากคุณต้องการตัดภาพเพื่อแสดงเป็นวงกลมที่นี่คุณไป

public static Bitmap getCircularBitmap(Bitmap bitmap) {
        Bitmap output;

        if (bitmap.getWidth() > bitmap.getHeight()) {
            output = Bitmap.createBitmap(bitmap.getHeight(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        } else {
            output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getWidth(), Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());

        float r = 0;

        if (bitmap.getWidth() > bitmap.getHeight()) {
            r = bitmap.getHeight() / 2;
        } else {
            r = bitmap.getWidth() / 2;
        }

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawCircle(r, r, r, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return output;
    }

0

ฉันทำอย่างนั้นฉันใช้สีพื้นหลังในภาพเวกเตอร์

ic_bg_picture.xml

 <vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="100dp"
    android:height="100dp"
    android:viewportWidth="100"
    android:viewportHeight="100">
  <path
      android:pathData="M100.6,95.5c0,-0.4 -0.1,-0.7 0,-1.1c-0.2,-0.7 -0.2,-1.4 -0.1,-2.1c0,-0.1 0,-0.2 0,-0.3c-0.1,-0.6 -0.1,-1.2 0,-1.8c-1,-1.3 -0.3,-2.9 -0.3,-4.3c-0.1,-28.7 -0.1,-57.3 -0.1,-86C68,-0.1 35.9,-0.1 3.8,-0.2C0.7,-0.2 0,0.5 0,3.6c0.1,32.1 0.1,64.2 0.1,96.2c31,0 62,-0.1 92.9,0.1c3.6,0 6.3,-0.2 7.5,-3.2C100.5,96.4 100.5,95.9 100.6,95.5zM46.3,95.2C26.4,94 2,74.4 3.8,46.8C5.1,27.2 24.4,2.7 52.6,4.6c20.2,1.4 43,21.3 41.5,45.1C96.1,72.4 73,96.8 46.3,95.2z"
      android:fillColor="#6200EE"/>
</vector>

ในกรณีของฉันฉันสร้างเวกเตอร์และเปลี่ยน android: fillColor = "# 6200EE"

ตามสีพื้นหลังของฉัน

  <ImageView
    android:id="@+id/iv_profile_image"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:contentDescription="@string/app_name"
    app:srcCompat="@color/colorPrimaryDark" />

<ImageView
    android:id="@+id/container_profile_image"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:contentDescription="@string/app_name"
    app:srcCompat="@drawable/ic_bg_picture"/>

ตัวอย่าง ตัวอย่างที่ 2


-1

เพียงใช้รหัสง่ายๆนี้: เพิ่มการพึ่งพาครั้งแรก:

implementation 'de.hdodenhof:circleimageview:2.2.0'

จากนั้นเพิ่มเลย์เอาต์ xml ในโค้ดต่อไปนี้: -

<de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto"
                                        android:id="@+id/Imgshaligram"
                                        android:layout_width="96dp"
                                        android:layout_height="96dp"
                                        android:src="@drawable/shaligram"
                                        app:civ_border_color="#d1b1b1"

                                        android:foregroundGravity="center"/>

-1

อีกทั้งห้องสมุดทั้งสองนี้สามารถช่วยคุณได้

https://github.com/vinc3m1/RoundedImageView

ใช้รหัสด้านล่าง:

implementation 'com.makeramen:roundedimageview:2.3.0'

การใช้งานง่าย:

<com.makeramen.roundedimageview.RoundedImageView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/imageView1"
        android:src="@drawable/photo1"
        android:scaleType="fitCenter"
        app:riv_corner_radius="30dip"
        app:riv_border_width="2dip"
        app:riv_border_color="#333333"
        app:riv_mutate_background="true"
        app:riv_tile_mode="repeat"
        app:riv_oval="true" />

https://github.com/chirag-kachhadiya/RoundedImageView

การใช้งานง่าย:

ใช้รหัสด้านล่าง:

implementation 'com.github.chirag-kachhadiya:RoundedImageView:1.0'



 <com.infinityandroid.roundedimageview.RoundedImageView
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:adjustViewBounds="true"
                android:src="@drawable/the_hundred"
                app:corner_radius="10" />

-1

ตามที่อธิบายไว้ในคำตอบของ Orhan Obut แต่มีการเปลี่ยนแปลง:

<ImageView
    android:layout_width="0dp"  //or use your own value
    android:layout_height="match_parent"
    android:src="@drawable/img"
    android:layout_weight="75" />// in case of use of weight

เพื่อหลีกเลี่ยงการเหยียดของภาพ และ img.xml:

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/profile" />
<item android:drawable="@drawable/circle" /></layer-list>

(ไม่มีการเปลี่ยนแปลง) และ circle.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadiusRatio="2"
android:shape="ring"
android:thickness="300dp"
android:useLevel="false">
<solid android:color="@android:color/white"/>
<stroke
    android:width="2dp"
    android:color="@android:color/black"/>
</shape>
 

นี่คือความหนาของวงแหวนที่ได้รับสูงสุด - 1000dp
และ radiusRatio คือความกว้างของภาพครึ่งหนึ่ง (ความกว้างวงแหวนสูงสุดใช่หรือไม่) - 2
และเส้นขีดสำหรับขอบที่ต้องการหากจำเป็น
ฉันใช้รูปสี่เหลี่ยม png (profile.png), btw ด้วยความกว้างและความสูงเดียวกัน สิ่งนี้ถูกต้องสำหรับมิติข้อมูล ImageView โดยพลการ ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.