如何制作带有圆角的ImageView?


573

在Android中,默认情况下,ImageView是一个矩形。如何在ImageView中使其成为一个圆角矩形(将Bitmap的所有4个角都切掉为圆角矩形)?



隐藏在较旧,更复杂的答案下面的是我认为现在应该接受的答案:RoundedBitmapDrawable,已在v4支持库修订版21中添加。–
Jonik

您可以使用CardView并在其中使用ImageView来实现最简单的方法-在此处查看示例stackoverflow.com/a/41479670/4516797
Taras Vovkovych

这个库非常有用。
grrigore

现在检查这一点,我们必须ShapeableImageView做出圆形或圆形的ImageView stackoverflow.com/a/61086632/7666442
Nilesh制作Rathod

Answers:


544

这是很晚的响应,但是对于正在寻找它的其他任何人,您都可以执行以下代码来手动使图像变圆。

http://www.ruibm.com/?p=184

这不是我的代码,但是我已经使用了它,并且效果很好。我将其用作ImageHelper类中的帮助器,并对其进行了扩展,以传递给定图像所需的羽化量。

最终代码如下所示:

package com.company.app.utils;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;

public class ImageHelper {
    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
                .getHeight(), 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());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return output;
    }
}

希望这对某人有帮助!


4
它不适用于所有设备。是否需要在任何地方进行更改?
春假

7
一张200 * 200的图片需要大约0.03秒的时间,所以我认为这不是最佳解决方案。
Jacky 2013年

2
它仅舍入左上角和右上角。为什么呢
Prateek

1
@ vinc3m1解决方案在这里github.com/makeramen/RoundedImageView真的很好!还看到他的答案(stackoverflow.com/a/15032283/2048266
nommer

16
尝试设置imageview的scaletype时无法正常工作,只有fitXY在起作用,centerCrop等显示出不可预测的结果,这里有人遇到同样的问题吗?
Shivansh 2014年

211

尽管上述答案有效,但Romain Guy(Android的核心开发人员)在他的博客中展示了一种更好的方法,该方法通过使用着色器而不创建位图的副本来使用更少的内存。该功能的基本要点如下:

BitmapShader shader;
shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(shader);

RectF rect = new RectF(0.0f, 0.0f, width, height);

// rect contains the bounds of the shape
// radius is the radius in pixels of the rounded corners
// paint contains the shader that will texture the shape
canvas.drawRoundRect(rect, radius, radius, paint);

与其他方法相比,它的优势在于:

  • 不会创建位图的单独副本,因为它会占用大量内存和大图像[与此处的大多数其他答案相比]
  • 支持抗锯齿 [vs clipPath方法]
  • 支持alpha [vs xfermode + porterduff方法]
  • 支持硬件加速 [vs clipPath方法]
  • 只能在画布上绘制一次 [vs xfermode和clippath方法]

我已经基于此代码创建了RoundedImageView,该代码将该逻辑包装到ImageView中并添加了适当的ScaleType支持和可选的圆角边框。


在您/ example / res / layout / rounded_item.xml 为什么要对所有源进行硬编码时指定图像src?不错的演示,只是矫kill过正。
某处某人2013年

您的样本存在严重的内存不足问题,就像Romain Guy的原始样本一样。我仍然不知道是什么原因造成的,但是就像他的代码一样,这确实很难找到。如果由于OOM而看不到应用程序崩溃,则可以多次旋转应用程序,直到发生故障为止(取决于您的设备,ROM等)。我已经报道了它过去的位置:stackoverflow.com/questions/14109187/...
Android开发者

1
没有其他人报告内存不足的问题,因此,您在代码之外进行的操作一定是不正确的。该示例正确地在适配器中保留了一组有限的位图,而无需在每次绘制视图时都重新创建它们。此处显示的示例是Drawable中的draw()方法的代码段,该方法使用对它保存并正常工作的原始位图的引用。这并不意味着更改原始位图,而仅使用圆角渲染它。在该示例中,中心裁剪效果也很好。
vinc3m1

1
如果您可以提供无法使用的屏幕截图或设备,甚至可以提供修复和提取请求,那将是最有效的。我已经在设备上测试了多次旋转,并且内存保持不变。
vinc3m1

11
请注意,如果图像尺寸大于2048像素,则无法使用。着色器不支持更大的纹理。
的Gabor

209

另一种简单的方法是使用具有拐角半径的CardView和内部的ImageView:

  <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:cardCornerRadius="8dp"
            android:layout_margin="5dp"
            android:elevation="10dp">

            <ImageView
                android:id="@+id/roundedImageView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/image"
                android:background="@color/white"
                android:scaleType="centerCrop"
                />
        </android.support.v7.widget.CardView>

在此处输入图片说明


5
似乎是一个不错的解决方法。但这并不能剪切棒棒糖之前的图像。
尼古拉

1
如果,我们只希望半径位于左上角和右上角而不是所有角上?
Pratik Singhal

3
在任何视图中应用曲线边框的非常简单和智能的方法。
AMI CHARADAVA '18年

1
好的解决方案,但仅在api级别21和更高版本中支持海拔高度
Saad Bilal

1
要禁用卡高程,请使用app:cardElevation =“ 0dp”(不是android:elevation)
约翰尼

148

裁剪到圆形形状已添加到ViewAPI 21中的类。

只是这样做:

  • 创建一个可绘制的圆形图形,如下所示:

res / drawable / round_outline.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="10dp" />
    ...
</shape>
  • 将可绘制对象设置为ImageView的背景: android:background="@drawable/round_outline"
  • 根据此文档,您需要做的就是添加android:clipToOutline="true"

不幸的是,存在一个错误,并且无法识别XML属性。幸运的是,我们仍然可以在Java中设置裁剪:

  • 在您的活动或片段中: ImageView.setClipToOutline(true)

它将是这样的:

在此处输入图片说明

注意:

此方法适用于任何可绘制的形状(不仅是圆形的)。它将把ImageView剪切到您在Drawable xml中定义的任何形状轮廓。

关于ImageViews的特别说明

setClipToOutline()仅在将视图的背景设置为可绘制形状时起作用。如果存在此背景形状,则“视图”会将形状的轮廓视为边框,以进行裁剪和阴影处理。

这意味着,如果要用于setClipToOutline()在ImageView上圆角化,则必须使用android:src代替设置图像android:background(因为必须将背景设置为圆形)。如果必须使用背景设置图像而不是src,则可以使用以下解决方法:

  • 创建布局并将其背景设置为可绘制的形状
  • 将该布局环绕在ImageView周围(不填充)
  • ImageView(包括布局中的任何其他内容)现在将以圆形布局形状显示。

10
错误:(x)在包“ android”中找不到属性“ clipToOutline”的资源标识符
Anu Martin

7
相反android:clipToOutline,必须使用android:outlineProvider="background"
WindRider

2
我之所以如此“喜欢” Google的另一个原因是,这个错误几乎与我的年龄相同,并且仍然存在于它的小世界中。Google似乎对此不予置评))
Farid

1
当我仅将背景形状中的topleft和topRight角设置为圆形时,此方法似乎没有成功。
Peterdk

@AnuMartin,这是一个已知问题-issuetracker.google.com/issues/37036728
Vadim Kotov

132

在支持库的v21中,现在有一个解决方案:称为RoundedBitmapDrawable

基本上,它就像普通的Drawable一样,只不过它为裁剪提供了一个拐角半径:

setCornerRadius(float cornerRadius)

因此,从Bitmap src和目标开始ImageView,它看起来像这样:

RoundedBitmapDrawable dr = RoundedBitmapDrawableFactory.create(res, src);
dr.setCornerRadius(cornerRadius);
imageView.setImageDrawable(dr);

3
十分感谢,这里的下一个步骤:stackoverflow.com/questions/24878740/...
大卫·dçè弗雷塔斯

居然还有android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory如此v4也支持它。
Deadfish

2
@deadfish是的,它在v4支持库中,但直到REVISION 21支持库才出现
tyczj

3
这是简单且最新的解决方案。它需要最少的代码量,并且具有很好的可扩展性。可以使用本地文件中的图像,缓存的可绘制对象,甚至可以使用Volley的NetworkImageView。我非常同意,正如@Jonik指出的那样,这应该是当今公认的答案。
katie

2
不幸的是不适用于scaleType centerCrop(支持库v25.3.1)
rocknow

67

我已经通过Custom ImageView完成了:

public class RoundRectCornerImageView extends ImageView {

    private float radius = 18.0f;
    private Path path;
    private RectF rect;

    public RoundRectCornerImageView(Context context) {
        super(context);
        init();
    }

    public RoundRectCornerImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public RoundRectCornerImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        path = new Path();

    }

    @Override
    protected void onDraw(Canvas canvas) {
        rect = new RectF(0, 0, this.getWidth(), this.getHeight());
        path.addRoundRect(rect, radius, radius, Path.Direction.CW);
        canvas.clipPath(path);
        super.onDraw(canvas);
    }
}

如何使用:

<com.mypackage.RoundRectCornerImageView
     android:id="@+id/imageView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@drawable/image"
     android:scaleType="fitXY" />

输出:

在此处输入图片说明

希望这对您有帮助。


这会使图像模糊
Amit Hooda

2
即使与android:scaleType =“ centerCrop”一起使用,也很简单,不会创建新的位图。谢谢!
埃纳兹姆

1
@Hiren此解决方案适用于带有背景图像的ImageView。但这不适用于仅具有背景颜色且没有图像的ImageViews。你能告诉我为什么会这样吗?
user2991413

Canvas.clipPath()java.lang.UnsupportedOperationException在某些情况下可能会导致。参见stackoverflow.com/questions/13248904/…–
Artyom

1
此解决方案仅适用于带有的图像集android:background,而不适用于android:src
CoolMind

64

快速的XML解决方案-

<android.support.v7.widget.CardView
            android:layout_width="40dp"
            android:layout_height="40dp"
            app:cardElevation="0dp"
            app:cardCornerRadius="4dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rounded_user_image"
        android:scaleType="fitXY"/>

</android.support.v7.widget.CardView>

您可以在CardView上设置所需的宽度,高度和半径,并在ImageView上设置scaleType。

搭配AndroidX使用 <androidx.cardview.widget.CardView>


4
在我的情况下,这种方法适用于androidx.cardview.widget.CardView
Ivan,

7
不确定为什么没有更多投票吗?在我看来,没有库和大量糟糕代码的最佳解决方案(尽管在我的案例中使用了centerCrop缩放)。
ThemBones

1
还没有很多支持,因为这是一个新的答案。但是我很快就将+1移到了+1!谢谢!
Micer

但是,它可以工作,但是这里的图像会由于拉伸而scaleType="fitXY"看起来不正确@ThemBones
WIZARD

@WIZARD这就是为什么我提到您可以在ImageView上设置所需的scaleType的原因
Chirag Mittal,

57

我发现这两种方法都有助于提出可行的解决方案。这是我的复合版本,它与像素无关,可以让您拥有一些正方形的角,而其余的角具有相同的半径(这是通常的使用情况)。借助以上两种解决方案:

public static Bitmap getRoundedCornerBitmap(Context context, Bitmap input, int pixels , int w , int h , boolean squareTL, boolean squareTR, boolean squareBL, boolean squareBR  ) {

    Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
    Canvas canvas = new Canvas(output);
    final float densityMultiplier = context.getResources().getDisplayMetrics().density;

    final int color = 0xff424242;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, w, h);
    final RectF rectF = new RectF(rect);

    //make sure that our rounded corner is scaled appropriately
    final float roundPx = pixels*densityMultiplier;

    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);


    //draw rectangles over the corners we want to be square
    if (squareTL ){
        canvas.drawRect(0, h/2, w/2, h, paint);
    }
    if (squareTR ){
        canvas.drawRect(w/2, h/2, w, h, paint);
    }
    if (squareBL ){
        canvas.drawRect(0, 0, w/2, h/2, paint);
    }
    if (squareBR ){
        canvas.drawRect(w/2, 0, w, h/2, paint);
    }


    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(input, 0,0, paint);

    return output;
}

另外,我覆盖了ImageView来放置它,以便可以在xml中定义它。您可能需要添加超级​​调用在此处所做的一些逻辑,但是我已经对其进行了评论,因为它对我的情况没有帮助。

    @Override
protected void onDraw(Canvas canvas) {
    //super.onDraw(canvas);
        Drawable drawable = getDrawable();

        Bitmap b =  ((BitmapDrawable)drawable).getBitmap() ;
        Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);

        int w = getWidth(), h = getHeight();


        Bitmap roundBitmap =  CropImageView.getRoundedCornerBitmap( getContext(), bitmap,10 , w, h , true, false,true, false);
        canvas.drawBitmap(roundBitmap, 0,0 , null);
}

希望这可以帮助!


4
非常棒,尤其是扩展ImageView
某处某人

2
保持ImageView#onDraw()逻辑的一种简单方法是将圆角位图设置为ImageView的可绘制对象,并留下super.onDraw()来绘制位图。我创建了一个RoundedCornerImageView类,其用法示例在此处。请注意,我使用的getRoundedCornerBitmap()与像素无关。
umbalaconmeogia

感谢RoundedCornerImageView。我使用了它,但将其修改为与像素密度无关。
PacificSky

umba的RoundedCornerImageView的源代码在这里:code.google.com/p/android-batsg/source/browse/trunk/…–
某处某人

@Caspar Harmer只需1次编辑就可以正常工作...有四个条件..只需更改它们,就像我设置true,true,false,false一样,它将设置底角而不是顶角..否则代码运行正常.so squareTL和squareTR分别是squareBL和squareBR的条件,反之亦然。
TheFlash

48

圆角图像在这里使用ImageLoader

创建DisplayImageOptions

DisplayImageOptions options = new DisplayImageOptions.Builder()
    // this will make circle, pass the width of image 
    .displayer(new RoundedBitmapDisplayer(getResources().getDimensionPixelSize(R.dimen.image_dimen_menu))) 
    .cacheOnDisc(true)
    .build();

imageLoader.displayImage(url_for_image,ImageView,options);

或者,您可以Picasso从Square中使用Library。

Picasso.with(mContext)
    .load(com.app.utility.Constants.BASE_URL+b.image)
    .placeholder(R.drawable.profile)
    .error(R.drawable.profile)
    .transform(new RoundedTransformation(50, 4))
    .resizeDimen(R.dimen.list_detail_image_size, R.dimen.list_detail_image_size)
    .centerCrop()
    .into(v.im_user);

您可以在这里下载RoundedTransformation文件


1
不显示图像
阿米特Thaper

3
毕加索图书馆一个很好,而且很容易实现,非常感谢+1
Hitesh

3
Picasso库似乎没有转换“占位符”和“错误”图像,因此,如果图像加载失败(错误)或最初加载需要一段时间(占位符),则该图像不会显示为四舍五入的图像。 github.com/square/picasso/issues/337
Pelpotronic

该库还提供了其他有用的毕加索转换,其中还包含RoundedCornersTransformation:github.com/wasabeef/picasso-transformations
Massimo

在Univ中不适用于裁剪图像。图像加载器。
Yar

26

因为对于我来说,所有答案对于我来说似乎太复杂了,所以我想到了另一个我认为值得分享的解决方案,以防XML与图像共享:

创建具有透明内容的边框形状,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners 
        android:radius="30dp" />
    <stroke 
        android:color="#ffffffff"
        android:width="10dp" />
</shape> 

然后,您可以在RelativeLayout中先放置图像,然后再使用另一个ImageView将其放置在形状上方的相同位置。封面形状的尺寸应比边框宽度大。当定义了外部半径时,请小心选择更大的拐角半径,但是内部半径将覆盖图像。

希望它也能帮助到别人。

根据CQM请求编辑相关布局示例:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageToShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imgCorners"
        android:layout_alignLeft="@+id/imgCorners"
        android:layout_alignRight="@+id/imgCorners"
        android:layout_alignTop="@+id/imgCorners"
        android:background="#ffffff"
        android:contentDescription="@string/desc"
        android:padding="5dp"
        android:scaleType="centerCrop" />

    <ImageView
        android:id="@+id/imgCorners"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:contentDescription="@string/desc"
        android:src="@drawable/corners_white" />

</RelativeLayout>

您能否通过更多代码来详细说明这一点,尤其是第二个图像视图正在执行的操作以及在其中应用了“边框形状” xml(作为src或作为背景?)的几个问题。我想喜欢这个解决方案,因为它可以让我独立控制所有四个角
CQM 2014年

1
尽管这似乎是一个简单的答案,但不幸的是,它在“蒙版”图像视图周围增加了空白,这是不希望的副作用。
Abdalrahman Shatou 2014年

是的,但是对于基于带有圆角和透明背景的PNG-Drawable的ImageView或如果您具有未定义的宽高比的9-Patch-Drawable的ImageView,也可以使用该方法。
基督教徒

我正在做同样的事情,它的工作;只是想知道它是否不会对方向和手机大小造成任何问题?
开放免费

如果保持彼此相对的尺寸,则不会造成问题。
基督教徒

21

与版本开始1.2.0-alpha03的的的材料构件库有新的ShapeableImageView

您可以使用类似:

  <com.google.android.material.imageview.ShapeableImageView
      ...
      app:shapeAppearanceOverlay="@style/roundedImageView"
      app:srcCompat="@drawable/ic_image" />

与:

  <style name="roundedImageView" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">8dp</item>
  </style>

或以编程方式:

float radius = getResources().getDimension(R.dimen.default_corner_radius);
imageView.setShapeAppearanceModel(imageView.getShapeAppearanceModel()
    .toBuilder()
    .setAllCorners(CornerFamily.ROUNDED,radius)
    .build());

在此处输入图片说明


如果图像具有背景色,则当前会产生背景色以在圆角下弹出。这也将忽略图像上的scaleType属性。
inokey

14

我的ImageView实现带有圆角小部件,该控件(缩小||放大)将图像缩放到所需的尺寸。它使用代码形式CaspNZ。

public class ImageViewRounded extends ImageView {

    public ImageViewRounded(Context context) {
        super(context);
    }

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

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

    @Override
    protected void onDraw(Canvas canvas) {
        BitmapDrawable drawable = (BitmapDrawable) getDrawable();

        if (drawable == null) {
            return;
        }

        if (getWidth() == 0 || getHeight() == 0) {
            return; 
        }

        Bitmap fullSizeBitmap = drawable.getBitmap();

        int scaledWidth = getMeasuredWidth();
        int scaledHeight = getMeasuredHeight();

        Bitmap mScaledBitmap;
        if (scaledWidth == fullSizeBitmap.getWidth() && scaledHeight == fullSizeBitmap.getHeight()) {
            mScaledBitmap = fullSizeBitmap;
        } else {
            mScaledBitmap = Bitmap.createScaledBitmap(fullSizeBitmap, scaledWidth, scaledHeight, true /* filter */);
        }

        Bitmap roundBitmap = ImageUtilities.getRoundedCornerBitmap(getContext(), mScaledBitmap, 5, scaledWidth, scaledHeight,
                false, false, false, false);
        canvas.drawBitmap(roundBitmap, 0, 0, null);

    }

}

12
ImageUtilities来自哪里?
JasonWyatt

1
@JasonWyatt见下方的sorrodos帖子
Damjan

12

最近,还有另一种方法-使用Glide的Generated API。它需要一些初步的工作,但随后会为您提供Glide的所有功能,并且可以灵活地执行任何操作,因为您会缠绕实际的代码,因此从长远来看,我认为这是一个不错的解决方案。另外,用法非常简单整洁。

首先,设置Glide 4+版本:

implementation 'com.github.bumptech.glide:glide:4.6.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'

然后创建Glid的app模块类以触发注释处理:

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}

然后创建实际完成工作的Glide扩展。您可以对其进行自定义,以执行所需的任何操作:

@GlideExtension
public class MyGlideExtension {

    private MyGlideExtension() {}

    @NonNull
    @GlideOption
    public static RequestOptions roundedCorners(RequestOptions options, @NonNull Context context, int cornerRadius) {
        int px = Math.round(cornerRadius * (context.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT));
        return options.transforms(new RoundedCorners(px));
    }
}

添加这些文件后,构建您的项目。

然后像下面这样在您的代码中使用它:

GlideApp.with(this)
        .load(imageUrl)
        .roundedCorners(getApplicationContext(), 5)
        .into(imageView);

不要忘记在参数之间RequestOptionsoptions参数之间添加空格
StevenTB

做完了 感谢您的输入。
Codesalot爵士,18年

.roundedCorners不来了,我们需要设置其他设置吗?甚至在重建项目之后
aNdRO博士

这对我有用,谢谢。我发现避免使用带@GlideExtension注释的类更简单,只使用.transform(new RoundedCorners(px))where px相同的(int px = Math.round(cornerRadius * (context.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT));)。
Michael Osofsky '19年

10

有一个很酷的库,可让您塑造图像视图。

这是一个例子:

<com.github.siyamed.shapeimageview.mask.PorterShapeImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:siShape="@drawable/shape_rounded_rectangle"
    android:src="@drawable/neo"
    app:siSquare="true"/>

形状定义:

<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
    <corners
        android:topLeftRadius="18dp"
        android:topRightRadius="18dp"
        android:bottomLeftRadius="18dp"
        android:bottomRightRadius="18dp" />
    <solid android:color="@color/black" />
</shape>

结果:

结果


1
这很棒,并且还有更多功能,例如您可以添加边框并使用任何形状
Adam Kis

8

这是一个覆盖imageView的简单示例,然后您也可以在布局设计器中使用它进行预览。

public class RoundedImageView extends ImageView {

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

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

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

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public RoundedImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void setImageDrawable(Drawable drawable) {
        float radius = 0.1f;
        Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
        RoundedBitmapDrawable rid = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
        rid.setCornerRadius(bitmap.getWidth() * radius);
        super.setImageDrawable(rid);
    }
}

这是快速解决方案。半径用于所有角,并且基于位图宽度的百分比。

我只是重写了setImageDrawable支持v4方法,并将其用于可绘制的圆形位图。

用法:

<com.example.widgets.RoundedImageView
        android:layout_width="39dp"
        android:layout_height="39dp"
        android:src="@drawable/your_drawable" />

使用imageView和自定义imageView进行预览:

在此处输入图片说明


这在任何情况下都有效,谢谢。你救了我的日子。
Mehul Solanki

7

您应该扩展ImageView并绘制自己的圆角矩形。

如果要在图像周围添加框架,还可以将圆角框架叠加在布局中图像视图的顶部。

[edit] FrameLayout例如,使用叠加帧以显示原始图像。的第一个元素是FrameLayout要显示的图像四舍五入。然后ImageView在框架中添加另一个。第二个ImageView将显示在原始图片的顶部,ImageView因此Android会将其内容绘制在orignal上方ImageView


谢谢。但是,只有ImageView的setDrawable方法,如何将ImageView的setDrawable设置为图像的内容,然后在ImageView的顶部叠加一个圆形框架?
迈克尔

对不起,我不清楚。我的意思是在布局中叠加:因此(即)在其中使用FrameLayoutput ImageViewImageView在圆角框架中添加另一个。这样,第一个ImageView将显示您选择的图片,第二个ImageFrame将显示圆形的框。
Mrsnowflake

正确-使用FrameLayout可以将一个图像/视图与另一个图像/视图重叠。您还可以使用FrameLayout的android:foreground标签。
理查德·勒·马修里尔

7

罗曼·盖(Romain Guy)就在这里。

缩小版如下。

Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.image)).getBitmap();

Bitmap bitmapRounded = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
Canvas canvas = new Canvas(bitmapRounded);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
canvas.drawRoundRect((new RectF(0.0f, 0.0f, bitmap.getWidth(), bitmap.getHeight())), 10, 10, paint);

imageView.setImageBitmap(bitmapRounded);

可悲的是,尽管它可以工作,但是和这里的其他解决方案一样,它创建了一个新的位图,而不是使用当前的位图。
android开发人员

并不是的。bitmapRounded将被一次又一次地使用。如果可以访问可绘制的画布,则可以直接使用draw方法,而不用生成新的位图。
亚历克斯

你是怎样做的?假设我不使用任何特殊的drawable,而仅处理单个位图,并在过程结束时使用setImageBitmap。我将如何实现这样的目标?
android开发人员


两者都不会更改位图,而是使用自定义drawable和自定义imageview对其进行包装。这不是我问的。我问你如何改变位图本身。
Android开发人员

7

就我而言,这种纯XML解决方案已经足够了。http://www.techrepublic.com/article/pro-tip-round-corners-on-an-android-imageview-with-this-hack/

编辑

简而言之,这就是答案:

在/ res / drawable文件夹中,创建一个frame.xml文件。在其中,我们定义了一个带有圆角和透明中心的简单矩形。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
     <solid android:color="#00ffffff" />
     <padding android:left="6dp"
        android:top="6dp"
        android:right="6dp"
        android:bottom="6dp" />
     <corners android:radius="12dp" />
     <stroke android:width="6dp" android:color="#ffffffff" />
</shape>

在布局文件中,添加一个包含标准ImageView的LinearLayout以及一个嵌套的FrameLayout。FrameLayout使用填充和自定义可绘制对象给出圆角的错觉。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_gravity="center"
    android:gravity="center" 
    android:background="#ffffffff">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="6dp"
        android:src="@drawable/tr"/>

    <FrameLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="6dp"
            android:src="@drawable/tr"/>

        <ImageView 
             android:src="@drawable/frame"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />

    </FrameLayout>

</LinearLayout>

好主意,我用它来显示一个不均匀的ImageView角落
Gal Rom 2015年

6

对于上面的George Walters II的道具,我只是接受了他的回答,并对其进行了扩展,以支持以不同的方式四舍五入各个角。可以进一步优化(某些目标区域重叠),但不是很多。

我知道这个线程有些旧,但是它是Google上如何在Android上修整ImageViews角落的最佳结果之一。

/**
 * Use this method to scale a bitmap and give it specific rounded corners.
 * @param context Context object used to ascertain display density.
 * @param bitmap The original bitmap that will be scaled and have rounded corners applied to it.
 * @param upperLeft Corner radius for upper left.
 * @param upperRight Corner radius for upper right.
 * @param lowerRight Corner radius for lower right.
 * @param lowerLeft Corner radius for lower left.
 * @param endWidth Width to which to scale original bitmap.
 * @param endHeight Height to which to scale original bitmap.
 * @return Scaled bitmap with rounded corners.
 */
public static Bitmap getRoundedCornerBitmap(Context context, Bitmap bitmap, float upperLeft,
        float upperRight, float lowerRight, float lowerLeft, int endWidth,
        int endHeight) {
    float densityMultiplier = context.getResources().getDisplayMetrics().density;

    // scale incoming bitmap to appropriate px size given arguments and display dpi
    bitmap = Bitmap.createScaledBitmap(bitmap, 
            Math.round(endWidth * densityMultiplier),
            Math.round(endHeight * densityMultiplier), true);

    // create empty bitmap for drawing
    Bitmap output = Bitmap.createBitmap(
            Math.round(endWidth * densityMultiplier),
            Math.round(endHeight * densityMultiplier), Config.ARGB_8888);

    // get canvas for empty bitmap
    Canvas canvas = new Canvas(output);
    int width = canvas.getWidth();
    int height = canvas.getHeight();

    // scale the rounded corners appropriately given dpi
    upperLeft *= densityMultiplier;
    upperRight *= densityMultiplier;
    lowerRight *= densityMultiplier;
    lowerLeft *= densityMultiplier;

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.WHITE);

    // fill the canvas with transparency
    canvas.drawARGB(0, 0, 0, 0);

    // draw the rounded corners around the image rect. clockwise, starting in upper left.
    canvas.drawCircle(upperLeft, upperLeft, upperLeft, paint);
    canvas.drawCircle(width - upperRight, upperRight, upperRight, paint);
    canvas.drawCircle(width - lowerRight, height - lowerRight, lowerRight, paint);
    canvas.drawCircle(lowerLeft, height - lowerLeft, lowerLeft, paint);

    // fill in all the gaps between circles. clockwise, starting at top.
    RectF rectT = new RectF(upperLeft, 0, width - upperRight, height / 2);
    RectF rectR = new RectF(width / 2, upperRight, width, height - lowerRight);
    RectF rectB = new RectF(lowerLeft, height / 2, width - lowerRight, height);
    RectF rectL = new RectF(0, upperLeft, width / 2, height - lowerLeft);

    canvas.drawRect(rectT, paint);
    canvas.drawRect(rectR, paint);
    canvas.drawRect(rectB, paint);
    canvas.drawRect(rectL, paint);

    // set up the rect for the image
    Rect imageRect = new Rect(0, 0, width, height);

    // set up paint object such that it only paints on Color.WHITE
    paint.setXfermode(new AvoidXfermode(Color.WHITE, 255, AvoidXfermode.Mode.TARGET));

    // draw resized bitmap onto imageRect in canvas, using paint as configured above
    canvas.drawBitmap(bitmap, imageRect, imageRect, paint);

    return output;
}

+1用于增加密度乘数并增加对单个圆角的支持。实际上,我在顶部使用了该解决方案,因为您的解决方案无法正常工作-但这非常有帮助!请参阅下面的综合解决方案:
Caspar Harmer

6

将形状应用于您的形状,imageView如下所示:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <solid android:color="#faf5e6" />
    <stroke
        android:width="1dp"
        android:color="#808080" />
    <corners android:radius="15dp" />
    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp" />
</shape>

这可能对您的朋友有帮助。


6

为什么不剪裁draw()呢?

这是我的解决方案:

  • 通过裁剪扩展RelativeLayout
  • 将ImageView(或其他视图)放入布局中:

码:

public class RoundRelativeLayout extends RelativeLayout {

    private final float radius;

    public RoundRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray attrArray = context.obtainStyledAttributes(attrs,
                R.styleable.RoundRelativeLayout);
        radius = attrArray.getDimension(
                R.styleable.RoundRelativeLayout_radius, 0);
    }

    private boolean isPathValid;
    private final Path path = new Path();

    private Path getRoundRectPath() {
        if (isPathValid) {
            return path;
        }

        path.reset();

        int width = getWidth();
        int height = getHeight();
        RectF bounds = new RectF(0, 0, width, height);

        path.addRoundRect(bounds, radius, radius, Direction.CCW);
        isPathValid = true;
        return path;
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        canvas.clipPath(getRoundRectPath());
        super.dispatchDraw(canvas);
    }

    @Override
    public void draw(Canvas canvas) {
        canvas.clipPath(getRoundRectPath());
        super.draw(canvas);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int oldWidth = getMeasuredWidth();
        int oldHeight = getMeasuredHeight();
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int newWidth = getMeasuredWidth();
        int newHeight = getMeasuredHeight();
        if (newWidth != oldWidth || newHeight != oldHeight) {
            isPathValid = false;
        }
    }

}

1
我喜欢这种方法。我用它来创建自己的RoundImageView。谢谢你
Pascal

这在打开强制加速时不起作用,对吗?我没有看到简单的解决方法...
secureboot 2013年

您能否通过将结果作为可绘制对象来显示如何做到这一点,是否能够在内容周围添加轮廓(又称笔画),并且还能够仅对某些角进行圆角处理?
Android开发者

5

下面的代码创建一个圆角矩形布局对象,该对象围绕放置在其中的所有子对象绘制一个圆角矩形。它还演示了如何以编程方式创建视图和布局而不使用布局xml文件。

package android.example;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MessageScreen extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  int mainBackgroundColor = Color.parseColor("#2E8B57");
  int labelTextColor = Color.parseColor("#FF4500");
  int messageBackgroundColor = Color.parseColor("#3300FF");
  int messageTextColor = Color.parseColor("#FFFF00");

  DisplayMetrics metrics = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(metrics);
  float density = metrics.density;
  int minMarginSize = Math.round(density * 8);
  int paddingSize = minMarginSize * 2;
  int maxMarginSize = minMarginSize * 4;

  TextView label = new TextView(this);
  /*
   * The LayoutParams are instructions to the Layout that will contain the
   * View for laying out the View, so you need to use the LayoutParams of
   * the Layout that will contain the View.
   */
  LinearLayout.LayoutParams labelLayoutParams = new LinearLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  label.setLayoutParams(labelLayoutParams);
  label.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
  label.setPadding(paddingSize, paddingSize, paddingSize, paddingSize);
  label.setText(R.string.title);
  label.setTextColor(labelTextColor);

  TextView message = new TextView(this);
  RoundedRectangle.LayoutParams messageLayoutParams = new RoundedRectangle.LayoutParams(
 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
  /*
   * This is one of the calls must made to force a ViewGroup to call its
   * draw method instead of just calling the draw method of its children.
   * This tells the RoundedRectangle to put some extra space around the
   * View.
   */
  messageLayoutParams.setMargins(minMarginSize, paddingSize,
    minMarginSize, maxMarginSize);
  message.setLayoutParams(messageLayoutParams);
  message.setTextSize(TypedValue.COMPLEX_UNIT_SP, paddingSize);
  message.setText(R.string.message);
  message.setTextColor(messageTextColor);
  message.setBackgroundColor(messageBackgroundColor);

  RoundedRectangle messageContainer = new RoundedRectangle(this);
  LinearLayout.LayoutParams messageContainerLayoutParams = new LinearLayout.LayoutParams(
    LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
  messageContainerLayoutParams.setMargins(paddingSize, 0, paddingSize, 0);
  messageContainer.setLayoutParams(messageContainerLayoutParams);
  messageContainer.setOrientation(LinearLayout.VERTICAL);
  /*
   * This is one of the calls must made to force a ViewGroup to call its
   * draw method instead of just calling the draw method of its children.
   * This tells the RoundedRectangle to color the the exta space that was
   * put around the View as well as the View. This is exterior color of
   * the RoundedRectangle.
   */
  messageContainer.setBackgroundColor(mainBackgroundColor);
  /*
   * This is one of the calls must made to force a ViewGroup to call its
   * draw method instead of just calling the draw method of its children.
   * This is the interior color of the RoundedRectangle. It must be
   * different than the exterior color of the RoundedRectangle or the
   * RoundedRectangle will not call its draw method.
   */
  messageContainer.setInteriorColor(messageBackgroundColor);
  // Add the message to the RoundedRectangle.
  messageContainer.addView(message);

  //
  LinearLayout main = new LinearLayout(this);
  LinearLayout.LayoutParams mainLayoutParams = new LinearLayout.LayoutParams(
    LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
  main.setLayoutParams(mainLayoutParams);
  main.setOrientation(LinearLayout.VERTICAL);
  main.setBackgroundColor(mainBackgroundColor);
  main.addView(label);
  main.addView(messageContainer);

  setContentView(main);
 }
}

RoundedRectangle布局对象的类如下所示:

/**
 *  A LinearLayout that draws a rounded rectangle around the child View that was added to it.
 */
package android.example;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.widget.LinearLayout;

/**
 * A LinearLayout that has rounded corners instead of square corners.
 * 
 * @author Danny Remington
 * 
 * @see LinearLayout
 * 
 */
public class RoundedRectangle extends LinearLayout {
 private int mInteriorColor;

 public RoundedRectangle(Context p_context) {
  super(p_context);
 }

 public RoundedRectangle(Context p_context, AttributeSet attributeSet) {
  super(p_context, attributeSet);
 }

 // Listener for the onDraw event that occurs when the Layout is drawn.
 protected void onDraw(Canvas canvas) {
  Rect rect = new Rect(0, 0, getWidth(), getHeight());
  RectF rectF = new RectF(rect);
  DisplayMetrics metrics = new DisplayMetrics();
  Activity activity = (Activity) getContext();
  activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
  float density = metrics.density;
  int arcSize = Math.round(density * 10);

  Paint paint = new Paint();
  paint.setColor(mInteriorColor);

  canvas.drawRoundRect(rectF, arcSize, arcSize, paint);
 }

 /**
  * Set the background color to use inside the RoundedRectangle.
  * 
  * @param Primitive int - The color inside the rounded rectangle.
  */
 public void setInteriorColor(int interiorColor) {
  mInteriorColor = interiorColor;
 }

 /**
  * Get the background color used inside the RoundedRectangle.
  * 
  * @return Primitive int - The color inside the rounded rectangle.
  */
 public int getInteriorColor() {
  return mInteriorColor;
 }

}

5

科特林

import android.graphics.BitmapFactory
import android.os.Bundle
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory
import kotlinx.android.synthetic.main.activity_main.*

val bitmap = BitmapFactory.decodeResource(resources, R.drawable.myImage)
val rounded = RoundedBitmapDrawableFactory.create(resources, bitmap)
rounded.cornerRadius = 20f
profileImageView.setImageDrawable(rounded)

要发出ImageView通告,我们可以更改cornerRadius

rounded.isCircular = true

4

非常感谢您首先回答。这是修改后的版本,可将矩形图像转换为正方形图像(并四舍五入),并通过填充颜色作为参数。

public static Bitmap getRoundedBitmap(Bitmap bitmap, int pixels, int color) {

    Bitmap inpBitmap = bitmap;
    int width = 0;
    int height = 0;
    width = inpBitmap.getWidth();
    height = inpBitmap.getHeight();

    if (width <= height) {
        height = width;
    } else {
        width = height;
    }

    Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, width, height);
    final RectF rectF = new RectF(rect);
    final float roundPx = pixels;

    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    canvas.drawBitmap(inpBitmap, rect, rect, paint);

    return output;
}

4

如果您使用的是Glide Library,则可能会有所帮助:

Glide.with(getApplicationContext())
     .load(image_url)
     .asBitmap()
     .centerCrop()
     .into(new BitmapImageViewTarget(imageView) {
        @Override
        protected void setResource(Bitmap resource) {
          RoundedBitmapDrawable circularBitmapDrawable =
                       RoundedBitmapDrawableFactory.create(getApplicationContext().getResources(), resource);
          circularBitmapDrawable.setCornerRadius(dpToPx(10));
          circularBitmapDrawable.setAntiAlias(true);
          imageView.setImageDrawable(circularBitmapDrawable);
        }
     });


public int dpToPx(int dp) {
  DisplayMetrics displayMetrics = getApplicationContext().getResources().getDisplayMetrics();
  return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
}

如果使用Glide 4及更高版本,请使用--- RequestOptions requestOptions = new RequestOptions(); requestOptions = requestOptions.transforms(new CenterCrop(),new RoundedCorners(16)); Glide.with(itemView.getContext()).load(item.getImage()).apply(requestOptions).into(mProgramThumbnail);
B.shruti

3

如果您的图片在互联网上,则最好的方法是使用glide和RoundedBitmapDrawableFactory(来自API 21-但在支持库中可用),如下所示:

 Glide.with(ctx).load(url).asBitmap().centerCrop().into(new BitmapImageViewTarget(imageView) {
    @Override
    protected void setResource(Bitmap res) {
        RoundedBitmapDrawable bitmapDrawable =
             RoundedBitmapDrawableFactory.create(ctx.getResources(), res);
        bitmapDrawable.setCircular(true);//comment this line and uncomment the next line if you dont want it fully cricular
        //circularBitmapDrawable.setCornerRadius(cornerRadius);
        imageView.setImageDrawable(bitmapDrawable);
    }
});

这是一个优雅的api,但是.centerInside似乎丢失了,因此最好使用xml来定义这样的参数
carl

当图像中有资源并且需要使用时,这也很有用centerCrop
Artyom '18

3

您只能ImageView在布局中使用glide,也可以使用,可以使用此方法应用圆角。

首先在gradle中写,

compile 'com.github.bumptech.glide:glide:3.7.0'

对于带有圆角的图像,

public void loadImageWithCorners(String url, ImageView view) {
    Glide.with(context)
            .load(url)
            .asBitmap()
            .centerCrop()
            .placeholder(R.color.gray)
            .error(R.color.gray)
            .diskCacheStrategy(DiskCacheStrategy.SOURCE)
            .into(new BitmapImageViewTarget(view) {
                @Override
                protected void setResource(Bitmap resource) {
                    RoundedBitmapDrawable circularBitmapDrawable =
                            RoundedBitmapDrawableFactory.create(context.getResources(), resource);
                    circularBitmapDrawable.setCornerRadius(32.0f); // radius for corners
                    view.setImageDrawable(circularBitmapDrawable);
                }
            });
}

调用方法:

loadImageWithCorners("your url","your imageview");

这将添加一个用于通过HTTP请求加载图像的库,与该问题无关。
creativecreatororbenot

将加载哪个库?对于图像加载,您可以纯粹基于滑行本身的方法和类使用滑行及其片段。无需添加其他库
Deep Patel

Glide是一个主要用于通过HTTP加载图像的库,但OP希望了解如何处理ImageView
creativecreatororbenot

2

在这里重定向的问题的答案是:“如何在Android中创建圆形ImageView?”

public static Bitmap getRoundBitmap(Bitmap bitmap) {

    int min = Math.min(bitmap.getWidth(), bitmap.getHeight());

    Bitmap bitmapRounded = Bitmap.createBitmap(min, min, bitmap.getConfig());

    Canvas canvas = new Canvas(bitmapRounded);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setShader(new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
    canvas.drawRoundRect((new RectF(0.0f, 0.0f, min, min)), min/2, min/2, paint);

    return bitmapRounded;
}

2

借助glide库和RoundedBitmapDrawableFactory类,很容易实现。您可能需要创建圆形占位符图像。

    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.setCornerRadius(10); //drawable.setCircular(true);
                imgProfilePicture.setImageDrawable(drawable);
            }
        });

2

对于使用Glide和Kotlin的产品,您可以通过扩展 RequestBuilder

fun <T> GlideRequest<T>.roundCorners(cornerRadius: Int) =
    apply(RequestOptions().transform(RoundedCorners(cornerRadius)))

并用作

 GlideApp.with(context)
            .load(url)
            .roundCorners(context.resources.getDimension(R.dimen.radius_in_dp).toInt())
            .into(imgView)

.roundedCorners不来了,我们需要设置其他设置吗?
aNdRO博士

是否添加了上述扩展功能roundCorners?@ Dr.aNdRO
dgngulcan

请提供正确的例子!这个答案令人困惑!
Junia Montana
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.