一、介紹
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/zh-tw/n/160423.html