ImageView trong vòng tròn thông qua xml


201

Tôi muốn tạo bất kỳ hình ảnh nào từ tôi ImageViewthành hình tròn có viền.

Tôi đã tìm kiếm nhưng không thể tìm thấy bất kỳ thông tin hữu ích nào (bất cứ điều gì tôi đã thử đều không hoạt động).

Làm thế nào tôi có thể đạt được điều này thông qua xml: Tạo một ImageViewsrc nhất định và làm cho nó tròn với một đường viền?


Làm cách nào để thay đổi src của ImageView trong mã java?
chenzhongpu

Giải pháp đơn giản tốt ở đây stackoverflow.com/a/28096369/2162226 - tất cả đều bằng Java, vì vậy bạn có thể áp dụng định dạng này một cách linh hoạt cho hình ảnh khi chạy
Gene Bo

Bạn phải đặt ImageView của mình bên trong CardView vì CardView chỉ có tính năng truy cập thuộc tính bán kính góc.
Vahag Chakhoyan

Câu trả lời:


222

Bạn có thể tạo một vòng tròn đơn giản với viền trắng và nội dung trong suốt với hình dạng.

// 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>

Sau đó, tạo một danh sách lớp có thể vẽ và đặt nó làm nền cho chế độ xem hình ảnh của bạn.

// 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>

và đặt nó làm nền cho hình ảnh của bạn.

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

Bạn sẽ có một cái gì đó như thế.

nhập mô tả hình ảnh ở đây


13
Và sau đó tôi đặt hình dạng đó thành nền của hình ảnh của tôi? Tôi đã thử điều đó nhưng không hiệu quả. Hình ảnh của tôi vẫn là hình chữ nhật :(
user3050910

3
có, sử dụng XML, vì sử dụng mã java rất tốn kém cho thiết bị di động. Với mã này, nó chỉ xuất hiện một vòng tròn phía sau hình ảnh của tôi, chứ không phải hình ảnh là một vòng tròn. Tôi đoán là cho đường viền, tôi muốn hình ảnh được làm tròn thành một vòng tròn trong vòng này
user3050910

5
Nhưng vẫn có gì đó không đúng. Bên cạnh hình ảnh có đường viền tròn ở phía trước, nó không trong suốt bên ngoài vòng tròn. Ý tôi là, vòng tròn ở đó, tuy nhiên, các góc hình ảnh có thể nhìn thấy và vượt qua khu vực vòng tròn phía sau nó
user3050910

79
Làm cách nào để thay đổi src của ImageView trong mã java nếu tôi áp dụng cách này?
chenzhongpu

3
Nguồn img vô dụng, cứng, tôi muốn thay đổi bằng mã
user924

290

Đây là cách đơn giản nhất mà tôi thiết kế. Thử cái này.

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>

Nếu bạn đang làm việc trên các phiên bản Android trên kẹo mút

<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>

Thêm viền vào vòng ImageView - PHIÊN BẢN MỚI NHẤT

Bọc nó với một CardView khác lớn hơn một chút so với bên trong và đặt màu nền của nó để thêm đường viền cho hình ảnh tròn của bạn. Bạn có thể tăng kích thước của CardView bên ngoài để tăng độ dày của đường viền.

<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
Cảm ơn vì điều đó. Đơn giản và dễ sử dụng bộ nhớ. Các thư viện tôi đã thử cho đến nay đều cung cấp cho OOMExceptions khi sử dụng chế độ xem Tùy chỉnh trong các mục RecyclerView.
COBB

11
Đã thử sử dụng tính năng này, có vẻ như nó không hoạt động với Android dưới 5.0. Mặc dù chế độ xem hình ảnh là hình tròn, nhưng hình ảnh nhỏ hơn với hình vuông, trông rất tệ. Bất kì lời đề nghị nào? 5.0 trở lên hoạt động tốt.
Kaps

6
hình ảnh của tôi không phù hợp với CardView với phương pháp này
Hendra Anggrian

21
Điều này làm cho cardview được làm tròn nhưng hình ảnh vẫn vuông bên dưới
kabuto178

5
Cảm ơn, Chìa khóa ở đây là Bán kính thẻ phải bằng một nửa chiều rộng và chiều cao để tạo thành một vòng tròn thích hợp.
B.shruti

124

Tôi hy vọng điều này sẽ giúp bạn.

1) Xem hình ảnh

nhập mô tả hình ảnh ở đây

 <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"/>

Đừng quên thực hiện: Tập lệnh Gradle> build.gradle (Mô-đun: ứng dụng)> phụ thuộc

     implementation 'de.hdodenhof:circleimageview:3.1.0'   

Để biết mô tả đầy đủ xin vui lòng kiểm tra ở đây: Nguồn ở đây.

2)

nhập mô tả hình ảnh ở đây

<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"/>

Đừng quên thực hiện: Tập lệnh Gradle> build.gradle (Mô-đun: ứng dụng)> phụ thuộc

     implementation 'com.mikhaellopez:circularimageview:4.2.0'   

Để biết mô tả đầy đủ xin vui lòng kiểm tra ở đây: Nguồn ở đây.


1
Làm thế nào để thay đổi phần màu xám thành màu trắng?
John Joe

2
Có một bản cập nhật kể từ khi nó được đăng. Border_colour và Border_ thong đã được đổi tên. Kiểm tra trang github để biết thêm thông tin: github.com/hdodenhof/CircleImageView
rharvey

Không hỗ trợ loại tỷ lệ. :(
Khan

hi nó hoạt động tốt khi cài đặt với src nhưng hành vi của nó khác khi cố gắng cài đặt bằng mã java
Erum

@Erum Bạn chỉ cần đặt biên dịch 'de.hdodenhof: circleimageview: 1.3.0' trong tệp gradle không cần mã java.
Sanjay Mangaroliya

46

Với sự trợ giúp của thư viện trượt và lớp RoundedBitmapDrawableFactory , thật dễ dàng để đạt được. Bạn có thể cần phải tạo hình ảnh giữ chỗ tròn.

Lướt V4:

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

Lướt 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);
            }
        });

Đối với Picasso RoundedTransatures , đây là một giải pháp thực sự tuyệt vời cung cấp tùy chọn bổ sung cho hình ảnh làm tròn ở cạnh trên hoặc dưới.


2
Không chắc chắn bạn đang sử dụng phiên bản lướt nào cho ví dụ này, nhưng với v4.0.0, bạn chỉ cần sử dụng RequestOptions của họ thay vì RoundedBitmapDrawable: Glide.with(context).load(imgUrl).apply(new RequestOptions().centerCrop()) .into(imageView)
Eugene Brusov

2
Ý bạn là không; Glide.with (bối cảnh) .load (imgUrl) .apply (new RequestOptions (). CircleCrop ()) .into (imageView)?
Androidz

3
Với phiên bản 4.6.1 sử dụng.apply(RequestOptions.circleCropTransform())
Pavel

2
Trong Glide v.4 nếu GlideAppđược cấu hình trong một ứng dụng : GlideApp.with(this).load(url).circleCrop().into(imageView);.
CoolMind

1
Tôi không thể tin rằng nó hoạt động dễ dàng như vậy mà không cần headche
Ajeeli

30

Các phương pháp trên dường như không hoạt động nếu bạn đang sử dụng srcthuộc tính. Những gì tôi đã làm là đặt hai khung nhìn hình ảnh bên trong một bố cục khung chồng lên nhau như thế này:

<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>

Chỉ cần đặt một hình tròn_crop.png trong thư mục có thể vẽ của bạn có hình dạng kích thước hình ảnh của bạn (hình vuông trong trường hợp của tôi) với nền trắng và hình tròn trong suốt ở giữa. Bạn có thể sử dụng hình ảnh này nếu bạn muốn có một hình ảnh vuông.

Hình tròn

Chỉ cần tải hình ảnh trên.


2
giải pháp tốt nhất! hiệu suất tốt nhất. thay đổi bitmap là vấn đề bộ nhớ
itzhar

Hình ảnh mẫu này là màu trắng vì vậy yeah. Nhưng bạn có thể tạo hình ảnh của riêng bạn bằng bất kỳ màu nào hoặc tải xuống hình ảnh này và chỉ cần thay đổi màu sắc của nó.
Jyotman Singh

Bạn có thể giải thích làm thế nào để tôi thay đổi màu sắc của hình ảnh thành màu đen? nó có thể được thực hiện từ bên trong Android Studio hay tôi cần một công cụ bên ngoài (người ta có thể thấy tôi không quen với việc tạo hình ảnh)
Zvi

Không không từ bên trong Android Studio. Bạn sẽ cần một cái gì đó như Photoshop. Bức ảnh này cũng được tạo ra bằng photoshop
Jyotman Singh

1
Bạn chỉ có thể cung cấp cho vòng tròn có thể vẽ một bộ lọc màu: circleCrop.setColorFilter (getResource (). GetColor (R.color.white)). Bằng cách này, bạn có thể có một vòng tròn có thể vẽ bất kỳ màu nào và tái sử dụng nó ở bất cứ đâu trong ứng dụng của bạn trên bất kỳ nền nào. Chỉ cần đặt bộ lọc màu với tài nguyên màu thích hợp mỗi lần.
mjp66

19

Sau đây là một trong những cách đơn giản nhất để làm điều đó, sử dụng mã sau đây:

Phụ thuộc

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

Mã 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

Ảnh chụp màn hình:

Ảnh chụp màn hình

Nguồn: Kho lưu trữ hình ảnh tròn GitHub

nhập mô tả hình ảnh ở đây


6
Không hỗ trợ loại tỷ lệ. :(
Khan

6

Điều này sẽ thực hiện các mẹo:

hình chữ nhật

<?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 (Danh sách lớp)

<?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>

Bố cục của bạn

 <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 là gì?
John Joe

đây có thể là bất kỳ hình ảnh giữ chỗ nào
Nidhi

trong trường hợp này, các cạnh của hình ảnh theo kích thước hình chữ nhật sẽ vượt qua các ranh giới của vòng tròn. Làm thế nào tôi có thể định vị chính xác từng hình ảnh, ở mọi chiều và hình thức, bên trong vòng tròn?
inverted_index

6

Chỉ cần sử dụng ShapeableImageViewđược cung cấp bởi Thư viện thành phần vật liệu.
Đôi khi như:

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

với:

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

nhập mô tả hình ảnh ở đây

Lưu ý: nó yêu cầu ít nhất là phiên bản 1.2.0-alpha03.


5

Bạn chỉ có thể sử dụng CardView mà không cần bất kỳ Thư viện bên ngoài

  <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

Tôi sử dụng hình dạng = "hình bầu dục" thay vì "vòng" bên dưới. Nó đã làm cho tôi. Để giữ hình ảnh trong giới hạn, tôi sử dụng <padding>và đặt <adjustViewBounds>thành đúng trong của tôi <ImageView>. Tôi đã thử với hình ảnh có kích thước từ 50 x 50 px lên đến 200x200 px.


Bạn cũng có thể thêm những điều sau đâyandroid:scaleType="fitCenter"
ihayet

2

@Jyotman Singh, câu trả lời là rất tốt (đối với nền tảng vững chắc), vì vậy tôi muốn nâng cao nó bằng cách chia sẻ vector có thể vẽ lại được cho nhu cầu của bạn, cũng rất thuận tiện vì hình dạng một mảnh của vector có khả năng mở rộng tốt.

Đây là hình dạng hình tròn hình chữ nhật (@ 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>

Cách sử dụng là như nhau:

<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>

Và làm thế nào là nó được cho là để làm việc? Bạn chỉ cần hiển thị một vòng tròn phía trên hình ảnh, trong khi những gì thực sự được hỏi là, làm thế nào để cắt hình ảnh, vì vậy nó sẽ trông giống như một vòng tròn.
Fattum

Vui lòng xem câu trả lời của @Jyotman Singh ở trên. Nó rất hữu ích cho tôi, vì vậy tôi đã tăng cường nó một chút. Để cắt hình ảnh, bạn có thể sử dụng:GlideApp.with(getApplicationContext()).asBitmap().load(profilePhotoUrl) .circleCrop()
ekar

Cảm ơn bạn cho hình dạng hình tròn trong một hình chữ nhật! Chính xác những gì tôi cần!
sirusexsir88

2

Chỉ cần sử dụng các dòng mã này và bạn đã hoàn thành:

<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" />

nhập mô tả hình ảnh ở đây

Đừng quên nhập:

import de.hdodenhof.circleimageview.CircleImageView;

Thêm thư viện này trong build.gradle:

compile 'de.hdodenhof:circleimageview:2.1.0'

bạn phải thiếu thứ gì đó trong lớp java
John Joe

1

Thử cái này.

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);
     }
 }

và sử dụng ImageView này trong bố cục như:

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

1

Nếu bạn sử dụng Thiết kế Vật liệu trong ứng dụng của mình thì hãy sử dụng

<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

Lớp này là Chế độ xem hình tròn tùy chỉnh với bóng, Stroke, bão hòa và sử dụng ImageView hình tròn tùy chỉnh này, bạn có thể tạo hình ảnh của mình trong Hình dạng tròn với Bán kính. Các chàng trai cho Image Shadow ImageView Không cần Github lớp này là đủ.

Thêm ThongImageView vào bố cục của bạn

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

Trên thực tế, bạn có thể sử dụng những gì Google cung cấp thông qua thư viện hỗ trợ Lớp RoundedBitmapDrawableFactory ( tại đâytại đây ), thay vì sử dụng thư viện bên thứ ba:

Học sinh lớp

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

ChínhActivity.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
        }
    }
}

res / layout / 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>

res / 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>

Kết quả:

nhập mô tả hình ảnh ở đây

Và, giả sử bạn muốn thêm một đường viền trên đầu trang, bạn có thể sử dụng ví dụ này:

Stro_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>

Và thêm android:foreground="@drawable/stroke_drawable"vào ImageView trong tệp XML bố trí và bạn nhận được điều này:

nhập mô tả hình ảnh ở đây

Mặc dù vậy, tôi không chắc chắn cách thêm bóng (sẽ hoạt động trên các phiên bản Android cũ hơn). Sử dụng FloatingActionButton (từ phụ thuộc "com.google.android.m vật liệu: vật liệu" ), tôi đã thất bại trong việc làm cho bitmap tự điền vào FAB. Sử dụng nó thay vào đó có thể thậm chí còn tốt hơn nếu nó hoạt động.


EDIT: nếu bạn muốn thêm bóng của độ cao (có sẵn từ API 21), bạn có thể thay đổi một chút những gì tôi đã viết:

Bên trong tệp XML bố trí:

<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"/>

Thông tưShadowViewOutlineProvider.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)
    }
}

Trong mã:

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

Kết quả:

nhập mô tả hình ảnh ở đây


0

Tôi có một giải pháp đơn giản. Tạo một tài sản Hình ảnh mới bằng cách nhấp chuột phải vào tên gói của bạn và chọn Mới-> Tài sản hình ảnh. Nhập tên (tên bất kỳ) và đường dẫn (vị trí của hình ảnh trong hệ thống của bạn). Sau đó nhấp vào Tiếp theo và Kết thúc. Nếu bạn nhập tên của hình ảnh là 'img', một hình ảnh tròn có tên 'img_round' sẽ được tạo tự động trong thư mục mipmap.

Sau đó, làm điều này:

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

Xem trước của bạn vẫn có thể hiển thị một hình ảnh hình chữ nhật. Nhưng nếu bạn chạy ứng dụng trên thiết bị của mình, nó sẽ tròn.


0

Tạo CustomImageview sau đó chỉ cần ghi đè onDraw()phương thức của nó như sau:

@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);

}

Trong trường hợp bạn cũng muốn mã cho tiện ích tùy chỉnh: -

Thông tưImageView.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);
    }
}

Ngoài ra, thêm mã sau vào res / attrs.xml của bạn để tạo thuộc tính bắt buộc: -

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

Điều này sẽ hoạt động khi hình ảnh không có nền. Làm gì sau đó?
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

Nếu bạn muốn cắt hình ảnh để hiển thị trong vòng tròn, ở đây bạn đi

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;
    }

-1

chỉ cần sử dụng mã đơn giản này: Đầu tiên thêm phụ thuộc:

implementation 'de.hdodenhof:circleimageview:2.2.0'

sau đó thêm vào bố cục xml đoạn mã sau: -

<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

Ngoài ra, hai thư viện này có thể giúp bạn.

https://github.com/vinc3m1/RoundedImageView

thực hiện mã dưới đây:

implementation 'com.makeramen:roundedimageview:2.3.0'

Cách sử dụng đơn giản:

<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

Cách sử dụng đơn giản:

thực hiện mã dưới đây:

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

Như đã được mô tả trong câu trả lời của Orhan Obut nhưng với những thay đổi:

<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

để tránh kéo dài hình ảnh. Và 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>

(không có thay đổi) và 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>
 

ở đây độ dày của vòng đạt tối đa - 1000dp
và radiusRatio là một nửa chiều rộng hình ảnh (chiều rộng vòng tối đa, có?) - 2
và nét là cho đường viền cần thiết nếu cần.
Tôi đã sử dụng hình ảnh png vuông (profile.png), btw. Với chiều rộng và chiều cao tương tự. Điều này là chính xác cho các phần tử ImageView tùy ý. nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.