public class ClipImageBorderView extends View {
//选择框距离左右的间距默认为dp
private int marginAbout=40;
//选择框距离上下的间距根据需要选择框宽度动态计算
private int marginTopAndButtom;
//选择框的颜色默认为白色
private int color= Color.parseColor("#FFFFFF");
//选择框边框的宽度
private int mBorderWidth =3;
//选择框的宽度
private int mwidth;
//圆形选择框框的时候底部背景画笔
private Paint mPaint;
//圆形选择框透明圆画笔
private Paint mBorderPaint;
private Xfermode cur_xfermode;
private Rect r;
private RectF rf;
public ClipImageBorderView(Context context) {
this(context,null);
}
public ClipImageBorderView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public ClipImageBorderView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//计算出选择框左右间距和选择框边框的px值
mwidth=dip2px(context,mwidth);
mBorderWidth=dip2px(context,mBorderWidth);
//实例化画笔
mPaint=new Paint();
//减轻除锯齿效果
mPaint.setAntiAlias(true);
//实例化圆形选择框画笔
mBorderPaint=new Paint();
//抗锯齿效果
mBorderPaint.setAntiAlias(true);
//设值画笔填充样式
mBorderPaint.setStyle(Paint.Style.STROKE);
//设置圆形选择框边框颜色
mBorderPaint.setColor(color);
//设置圆形选择框边框宽度
mBorderPaint.setStrokeWidth(mBorderWidth);
///设置混合模式 (只在源图像和目标图像相交的地方绘制目标图像)
cur_xfermode=new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//创建一个全屏正方形框
if(rf==null||rf.isEmpty()){
r=new Rect(0,0,getWidth(),getHeight());
rf=new RectF(r);
}
//为圆形选择框创建新的图层//还原所有 Canvas.ALL_SAVE_FLAG
int sc=canvas.saveLayer(rf,null,Canvas.ALL_SAVE_FLAG);
//计算出正方形选择框的宽和高
mwidth=getWidth()-marginAbout*2;
//计算出正方形选择框距离上下的间距
marginTopAndButtom=(getHeight()-mwidth)/2;
//设置画笔颜色
mPaint.setColor(Color.parseColor("#aa000000"));
//设置画笔填充样式为全部填充
mPaint.setStyle(Paint.Style.FILL);
//画一个正方形
canvas.drawRect(r,mPaint);
//为画笔添加混合样式
mPaint.setXfermode(cur_xfermode);
canvas.drawCircle(getWidth()/2,getHeight()/2,mwidth/2,mPaint);
canvas.drawCircle(getWidth()/2,getHeight()/2,mwidth/2,mBorderPaint);
// 还原混合模式
mPaint.setXfermode(null);
//还原画布
canvas.restoreToCount(sc);
// 正方形选择框
// //画笔填充颜色设置选择框其他区域半透明
// mPaint.setColor(Color.parseColor("#aa000000"));
// //设置画笔填充样式(设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE Style.FILL: 实心 STROKE:空心 FILL_OR_STROKE:同时实心与空心)
// mPaint.setStyle(Paint.Style.FILL);
// //绘制选择框左边的区域
// canvas.drawRect(0,0,marginAbout,getHeight(),mPaint);
// //绘制选择框右边的区域
// canvas.drawRect(getWidth()-marginAbout,0,getWidth(),getHeight(),mPaint);
// //绘制选择框顶部的区域
// canvas.drawRect(marginAbout,0,getWidth()-marginAbout,marginTopAndButtom,mPaint);
// //绘制选择框底部的区域
// canvas.drawRect(marginAbout,getHeight()-marginTopAndButtom,getWidth()-marginAbout,getHeight(),mPaint);
// //设置画笔颜色
// mPaint.setColor(color);
// //设置画笔填充样式
// mPaint.setStyle(Paint.Style.STROKE);
// // 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度
// mPaint.setStrokeWidth(mBorderWidth);
// //绘制选择框
// canvas.drawRect(marginAbout,marginTopAndButtom,getWidth()-marginAbout,getHeight()-marginTopAndButtom,mPaint);
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
应为主页xml只是调用这个自定义的View顺便给一个背景图片所以就不放上去了