android 实现一个或多个角为圆角图片
不废话先上图 :
实现思路:
- 先绘制一个圆角矩形,不知道的朋友可以去看下这篇文章
参考文章: 完美实现图片圆角和圆形(鸿洋) - 哪些角不需要绘制圆角,将其补全。
- 将需要设置成圆角图片的源图片和新绘制的圆角矩形进行合并(通过PorterDuff.mode)
实现过程
因为懒得自定义,也为了避免太多渗透(前者是关键),用的是生成圆角bitmap对象的方式。如果有需要的朋友可以参考思路自定义View。
- 生成圆角Bitmap对象
public class ImageUtils {
public static final int CORNER_TOP_LEFT = 1;
public static final int CORNER_TOP_RIGHT = 1 << 1;
public static final int CORNER_BOTTOM_LEFT = 1 << 2;
public static final int CORNER_BOTTOM_RIGHT = 1 << 3;
public static final int CORNER_ALL = CORNER_TOP_LEFT | CORNER_TOP_RIGHT | CORNER_BOTTOM_LEFT | CORNER_BOTTOM_RIGHT;
/**
* 把图片某固定角变成圆角
*
* @param bitmap 需要修改的图片
* @param pixels 圆角的弧度
* @param corners 需要显示圆弧的位置
* @return 圆角图片
*/
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels, int corners) {
//创建一个等大的画布
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), 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());
//生成包含坐标的矩形对象
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);
//异或将需要变为圆角的位置的二进制变为0
int notRoundedCorners = corners ^ CORNER_ALL;
//哪个角不是圆角我再把你用矩形画出来
if ((notRoundedCorners & CORNER_TOP_LEFT) != 0) {
canvas.drawRect(0, 0, roundPx, roundPx, paint);
}
if ((notRoundedCorners & CORNER_TOP_RIGHT) != 0) {
canvas.drawRect(rectF.right - roundPx, 0, rectF.right, roundPx, paint);
}
if ((notRoundedCorners & CORNER_BOTTOM_LEFT) != 0) {
canvas.drawRect(0, rectF.bottom - roundPx, roundPx, rectF.bottom, paint);
}
if ((notRoundedCorners & CORNER_BOTTOM_RIGHT) != 0) {
canvas.drawRect(rectF.right - roundPx, rectF.bottom - roundPx, rectF.right, rectF.bottom, paint);
}
//通过SRC_IN的模式取源图片和圆角矩形重叠部分
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//绘制成Bitmap对象
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
注意: 这里关于PorterDuff可以参考这个图,一共16种效果,大家可以一一尝试。先绘制的是黄色的图,后绘制的蓝色的图。
- 布局文件
<ImageView
android:id="@+id/iv_Test"
android:layout_width="200dp"
android:layout_height="300dp"
android:layout_centerInParent="true"
android:scaleType="centerCrop"
/>
- 使用
/**
* 设置数据
*/
private void setData() {
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
Bitmap disBitmap = ImageUtils.toRoundCorner(srcBitmap, DensityUtil.dipToPx(this, 20), ImageUtils.CORNER_TOP_LEFT|ImageUtils.CORNER_BOTTOM_RIGHT );
mIvTest.setImageBitmap(disBitmap);
srcBitmap.recycle();
}