attrs文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CircleImageView">
<attr name="src" format="reference"/>
</declare-styleable>
</resources>
class文件
package com.zdsoft.circleimageview;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by Administrator on 2017/1/11.
*/
public class CircleImageView extends View {
private int src;
public CircleImageView(Context context) {
super(context);
}
public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
/**
* 接收属性值
*
* @param context
* @param attrs
*/
private void init(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView);
if (typedArray != null) {
src = typedArray.getResourceId(R.styleable.CircleImageView_src, R.mipmap.ic_launcher);
typedArray.recycle();
}
}
@Override
protected void onDraw(Canvas canvas) {
Bitmap sfBitmap = null;//缩放后的bitmap
//1、获取Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), src);
//2、裁剪:对原始bitmap进行处理,看是否需要进行缩放处理,如果bitmap宽度或高度只要不等于圆的直径。
if (bitmap.getWidth() != getWidth() || bitmap.getHeight() != getWidth()) {
sfBitmap = Bitmap.createScaledBitmap(bitmap, getWidth(), getWidth(), false);
} else {
sfBitmap = bitmap;
}
Bitmap output = Bitmap.createBitmap(sfBitmap.getWidth(), sfBitmap.getHeight(), Bitmap.Config.ARGB_8888);
//3、实例化新的一张画布Canvas
Canvas canvas_new = new Canvas(output);
//4、对画布进行裁剪
Paint paint = new Paint();
paint.setAntiAlias(true);//抗锯齿
paint.setFilterBitmap(true);//抗锯齿,对位图进行滤波处理
paint.setDither(true);//设置防抖动,图像比较柔和
canvas_new.drawCircle(sfBitmap.getWidth() / 2, sfBitmap.getWidth() / 2, sfBitmap.getWidth() / 2, paint);
//5、核心部分,设置两张图片的相交模式,在这里就是上面绘制的Circle和下面绘制的Bitmap
Rect rect = new Rect(0, 0, sfBitmap.getWidth(), sfBitmap.getWidth());
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//取两层绘制交集,显示上层
canvas_new.drawBitmap(sfBitmap, rect, rect, paint);
//6、把输出bitmap放到输出画布上去
canvas.drawBitmap(output, 0, 0, null);
}
}
layout文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<com.zdsoft.circleimageview.CircleImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
app:src="@drawable/a1" />
</RelativeLayout>