一、介绍
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库是一个不错的选择。