一提到弄一个圆形的头像,很多人马上会想到用CircleIamgeView,但其实自己写一个也并不难自己写的部分也就20行代码,主要是用到PoterDuffXfermode来设置两个图层交集区域的显示方式
首先写一个继承自ImageView的控件
public class CircleImageView extends ImageView
然后创建构造方法
public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
之后重写onDraw方法
@Override
protected void onDraw(Canvas canvas) {
//获得图片的宽度
int width=getWidth();
//获得图片的高度
int height=getHeight();
//短的二分之一作为半径
int radius=height>width?width/2:height/2;
//重新定义的一个画布,这一步很关键
Paint mPaint = new Paint();
//抗锯齿
mPaint.setAntiAlias(true);
Bitmap bitmap = Bitmap.createBitmap(width,height,
Bitmap.Config.ARGB_8888);
Canvas bitmapCanvas = new Canvas(bitmap);
super.onDraw(bitmapCanvas);
//圆形的框
Bitmap cB = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
Canvas cCanv = new Canvas(cB);
//在控件中间画一个
cCanv.drawCircle(width/ 2, height/ 2, radius,
mPaint);
canvas.drawBitmap(bitmap, 0.0f, 0.0f, mPaint);
//dst是后画的图形
mPaint.setXfermode(new PorterDuffXfermode(
PorterDuff.Mode.DST_IN));
//一定要用之前的画布,不然会出现边角是黑色
bitmapCanvas.drawBitmap(cB, 0.0f, 0.0f, mPaint);
//给图形加边框
Paint paint =new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
paint.setColor(Color.BLACK);
canvas.drawCircle(width/ 2, height/ 2, radius,
paint);
}
一个简单的CircleImageView就做成了,你们还可以把边框弄成一个属性还有配置相应的方法,让使用者更加方便的使用
它的用法也是和ImageView一模一样的
<com.example.jkgeekjk.roadtodevelop3.CircleImageView
android:layout_width="match_parent"
android:src="@drawable/avastar"
android:layout_height="match_parent" />