一、介绍
Android开发中常用的ImageView控件默认情况下只能显示矩形图片,如果想要将图片显示为圆角,就需要进行特殊处理。在这篇文章中,我们将探讨几种实现Android ImageView控件圆角显示的方法,并给出代码示例。
二、使用ClipDrawable实现圆角显示
ClipDrawable是Android提供的一个Drawable对象,可以用于显示任意一个Drawable对象,但是只有指定区域内的部分会被显示出来。我们可以利用这个特性来实现ImageView的圆角显示。具体步骤如下:
1、在res/drawable目录下创建一个circle_bg.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="999dp" />
<solid android:color="#FFFFFFFF" />
</shape>
这个文件定义了一个全白色的矩形,并将其四个角弧度设置为999dp,这么大的弧度可以视为圆形。
2、在布局文件中引用这个Drawable,并将其作为ImageView的背景:
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/image"
android:background="@drawable/circle_bg" />
3、在Java代码中获取ImageView对象,并对其背景进行裁切:
ImageView imageView = findViewById(R.id.image_view);
ClipDrawable clipDrawable = new ClipDrawable(imageView.getBackground(), Gravity.CENTER, ClipDrawable.HORIZONTAL);
imageView.setBackground(clipDrawable);
以上代码中,我们获取到ImageView的背景,然后利用ClipDrawable的构造方法将其进行裁切。通过设置Gravity参数,我们可以指定裁切的方向,这里设置为水平方向,实现左右两边的圆角效果。
三、使用BitmapShader实现圆角显示
BitmapShader是Android提供的一个Shader对象,可以用于绘制位图。我们可以将它作为Paint对象的Shader属性,然后绘制一个带圆角的矩形,最后将这个矩形作为ImageView的背景。具体步骤如下:
1、创建一个circle_bg.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp" />
<solid android:color="#FFFFFFFF" />
</shape>
这个文件定义了一个白色背景,四个角的圆角半径为10dp。
2、在Java代码中获取ImageView对象,并将其设置为圆角:
ImageView imageView2 = findViewById(R.id.image_view2);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint paint = new Paint();
paint.setShader(shader);
RectF rectF = new RectF(0, 0, imageView2.getWidth(), imageView2.getHeight());
imageView2.setBackground(new BitmapDrawable(getResources(), getRoundBitmap(bitmap, 20)));
imageView2.setBackground(new RoundRectDrawableWithShadow(this, paint, rectF));
在这段代码中,我们首先获取到ImageView,并将需要显示的图片转化为Bitmap对象。然后,我们创建一个BitmapShader对象,并利用Paint的setShader方法将其设置为该对象的属性。接下来,我们创建一个带圆角的矩形,并将其作为ImageView的背景。具体创建方法如下:
public static Bitmap getRoundBitmap(Bitmap bitmap, int radius) {
int bitmapWidth = bitmap.getWidth();
int bitmapHeight = bitmap.getHeight();
Bitmap outBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(outBitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
Rect rect = new Rect(0, 0, bitmapWidth, bitmapHeight);
RectF rectF = new RectF(rect);
canvas.drawARGB(0, 0, 0, 0);
canvas.drawRoundRect(rectF, radius, radius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return outBitmap;
}
3、如果需要实现阴影效果,可以创建一个RoundRectDrawableWithShadow类:
public class RoundRectDrawableWithShadow extends Drawable {
private Paint mPaint;
private RectF mRectF;
private float mRadius;
private Path mPath;
public RoundRectDrawableWithShadow(Context context, Paint paint, RectF rectF) {
Resources resources = context.getResources();
mPaint = paint;
mRectF = rectF;
mRadius = resources.getDimensionPixelSize(R.dimen.cornerRadius);
mPath = new Path();
mPath.addRoundRect(mRectF, mRadius, mRadius, Path.Direction.CW);
}
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawPath(mPath, mPaint);
}
// ... 其他代码省略 ...
}
四、使用外部库实现圆角显示
如果以上两种方法在实现过程中存在过多复杂的操作,可以考虑使用现有的外部库来进行实现。这里我们推荐一款叫做Glide的图片加载库,在使用上非常方便,并且可以实现高性能的图片加载。具体步骤如下:
1、添加依赖关系到build.gradle文件中:
dependencies {
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}
2、在Java代码中引用Glide库,并将生成的ImageView对象的圆角属性设置为指定值:
ImageView imageView3 = findViewById(R.id.image_view3);
String imageUrl = "http://www.xxx.com/image.png";
Glide.with(this)
.load(imageUrl)
.apply(RequestOptions.bitmapTransform(new RoundedCorners(50)))
.into(imageView3);
在这段代码中,我们首先获取到要显示的ImageView对象,然后将需要加载的图片URL传入Glide库的with方法中。同时,我们通过apply方法设置了一个RoundedCorners对象,这个对象表示要将ImageView的圆角设置为50个像素。最后,我们将生成的ImageView对象交给Glide库处理即可。
五、总结
以上是实现Android ImageView控件圆角显示的几种方法,每一种方法都有自己的优点和适用场景。如果你只需要实现简单的圆角效果,可以尝试ClipDrawable和BitmapShader的方法,如果需要实现复杂的效果,或者需要高性能的图片加载,那么Glide库是一个不错的选择。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/160423.html
微信扫一扫
支付宝扫一扫