前言:
1.有句話說得好,好記性不如爛筆頭,寫博客其實主要還是給以後的自己看的(喂,我是以前的你,還能看得懂嗎?)
2.程序員寫代碼,能用一句話別那麼多廢話。自定義圓角控件(包括其他自定義代碼等等),網上很多,一搜一大坨,但是真正好的很少很少,都是抄,抄,抄,(咳咳....當然了我這個是借鑒,咳咳,借鑒哈)。對別人的代碼一定要理解,如果別人寫的不好,或者啰嗦的地方,用自己的理解去重新實現他,如下:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
import com.master.basecommon.other.utils.BitmapUtils;
/**
* 项 目 名: zing-android-reconfiguration<br>
* 版 权: Anhui 行云天下 Intelligent Technology CO.,LTD. Copyright YYYY-YYYY, All rights reserved<br>
* 修 改 人: gq<br>
* 修改时间: 2017/8/2<br>
* 功能描述:自定义控件实现圆角
*/
public class RoundAngleImageView extends ImageView
{
/**
*
* 这个是画圆的半径
*/
private int roundSize = 20;
public RoundAngleImageView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public RoundAngleImageView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public RoundAngleImageView(Context context)
{
super(context);
}
@Override
public void onDraw(Canvas canvas)
{
Drawable drawable = getDrawable();
if (null != drawable)
{
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
Bitmap b = BitmapUtils.getRoundBitmap(bitmap, roundSize);
final Rect rectSrc = new Rect(0, 0, getWidth(), getHeight());
canvas.drawBitmap(b, rectSrc, rectSrc, null);
}
else
{
super.onDraw(canvas);
}
}
}
自己新建一個BitmapUtils,加入getRoundBitmap,製作圓角方法:
/**
* 获取圆角矩形图片方法
*
* @param bitmap
* @param roundPx,一般设置成14
*/
public static Bitmap getRoundBitmap(Bitmap bitmap, int roundPx)
{
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setAntiAlias(true);// 抗锯齿
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.reset();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));// 取上层和下层交集上層
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
本人如此之帥,代碼如此清晰還用解釋嗎:so easy!!!
注意:這裡需要說明下,很嚴重的問題就是paint.setXfermode,即繪製的兩個圖層交集模式問題,個人強烈建議對上層的進行操作(例如,圓角矩形和bitmap交集取上層,SRC_IN),因為如果取下層,比如把bitmap放在下層,圓角矩形放在上層,使用DST_IN(上下交集取下層),按字面上理解應該是去了圓角的bitmap了,但是顯示的是圓角全部
如下圖所示:

圖1(SRC_IN) 圖2(DST_IN)
圖1:是canvas先畫圓角矩形,然後畫bitmap---正常
圖2:先畫bitmap再畫圓角矩形,初步判斷:實際圓角bitmap應該已經取出,但是下層非交集處也被展示出來。
註解:還有一個更簡便的圓角(圓形)方法
思路:
在imageview的src屬性和background屬性想辦法,因為src在background上面,所以我們可以把需要設置圓角的圖片設置為background,src配置遮蓋(自己網上搜一下,通過xml配置)成圓角就ok。