package cn.sinata.xldutils.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.graphics.Paint.Style; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; import cn.sinata.xldutils.utils.Utils; /** * 裁剪视图 * @author sinata */ public class ClipImageBorderView extends View{ public enum Mode{ Circle,Rect } private Mode mode=Mode.Rect;//默认矩形模式 /** * 水平方向与View的边距 */ private int mHorizontalPadding; /** * 垂直方向与View的边距 */ private int mVerticalPadding; /** * 绘制的矩形的宽度 */ private int mWidth; /** * 边框的颜色,默认为白色 */ private int mBorderColor = Color.parseColor("#FFFFFF"); /** * 边框的宽度 单位dp */ private int mBorderWidth = 1; private Paint mPaint; private float scale=1; public ClipImageBorderView(Context context) { this(context, null); } public ClipImageBorderView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ClipImageBorderView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mBorderWidth = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, mBorderWidth, getResources() .getDisplayMetrics()); mPaint = new Paint(); mPaint.setAntiAlias(true); // mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); } @Override protected void onDraw(Canvas canvas){ super.onDraw(canvas); // 计算矩形区域的宽度 mWidth = getWidth() - 2 * mHorizontalPadding; // 计算距离屏幕垂直边界 的边距 mVerticalPadding = (getHeight() - (int)(mWidth/scale)) / 2; mPaint.setColor(Color.parseColor("#aa000000")); mPaint.setStyle(Style.FILL); if (mode==Mode.Circle) { // drawRect(canvas); // canvas.translate(mHorizontalPadding, mVerticalPadding); drawLiftUp(canvas); drawRightUp(canvas); drawLiftDown(canvas); drawRightDown(canvas); // 绘制外边框 mPaint.setColor(mBorderColor); mPaint.setStrokeWidth(mBorderWidth); mPaint.setStyle(Style.STROKE); canvas.drawCircle(getWidth()/2, getHeight()/2, mWidth/2, mPaint); }else { // 绘制左边1 canvas.drawRect(0, 0, mHorizontalPadding, getHeight(), mPaint); // 绘制右边2 canvas.drawRect(getWidth() - mHorizontalPadding, 0, getWidth(), getHeight(), mPaint); // 绘制上边3 canvas.drawRect(mHorizontalPadding, 0, getWidth() - mHorizontalPadding, mVerticalPadding, mPaint); // 绘制下边4 canvas.drawRect(mHorizontalPadding, getHeight() - mVerticalPadding, getWidth() - mHorizontalPadding, getHeight(), mPaint); // 绘制外边框 mPaint.setColor(mBorderColor); mPaint.setStrokeWidth(mBorderWidth); mPaint.setStyle(Style.STROKE); canvas.drawRect(mHorizontalPadding, mVerticalPadding, getWidth() - mHorizontalPadding, getHeight() - mVerticalPadding, mPaint); } } public void setHorizontalPadding(int mHorizontalPadding) { this.mHorizontalPadding = mHorizontalPadding; } /** * 设置宽高比 * @param scale */ public void setImageScale(float scale){ this.scale=scale; } /** * 设置裁剪显示区域模式圆或矩形。默认矩形。 * @param mode */ public void setMode(Mode mode){ this.mode=mode; } // private void drawRect(Canvas canvas) { // Path path = new Path(); // path.setFillType(FillType.INVERSE_WINDING); // path.addRect(mHorizontalPadding, mVerticalPadding, getWidth()-mHorizontalPadding, getHeight()-mVerticalPadding, Direction.CCW); // canvas.drawPath(path, mPaint); // } private void drawLiftUp(Canvas canvas) { Path path = new Path(); path.moveTo(getWidth()/2, mVerticalPadding); path.lineTo(getWidth()/2, 0); path.lineTo(0, 0); path.lineTo(0, getHeight()/2); path.lineTo(mHorizontalPadding, getHeight()/2); path.arcTo(new RectF( mHorizontalPadding, mVerticalPadding, getWidth()-mHorizontalPadding, getHeight()-mVerticalPadding), 180, 90); path.close(); canvas.drawPath(path, mPaint); } private void drawLiftDown(Canvas canvas) { Path path = new Path(); path.moveTo(mHorizontalPadding, getHeight()/2); path.lineTo(0, getHeight()/2); path.lineTo(0, getHeight()); path.lineTo(getWidth()/2, getHeight()); path.lineTo(getWidth()/2, getHeight()-mVerticalPadding); path.arcTo(new RectF( mHorizontalPadding, mVerticalPadding, getWidth()-mHorizontalPadding, getHeight()-mVerticalPadding), 90, 90); path.close(); canvas.drawPath(path, mPaint); } private void drawRightDown(Canvas canvas) { Path path = new Path(); path.moveTo(getWidth()/2, getHeight()-mVerticalPadding); path.lineTo(getWidth()/2, getHeight()); path.lineTo(getWidth(), getHeight()); path.lineTo(getWidth(), getHeight()/2); path.lineTo(getWidth()-mHorizontalPadding, getHeight()/2); path.arcTo(new RectF( mHorizontalPadding, mVerticalPadding, getWidth()-mHorizontalPadding, getHeight()-mVerticalPadding), 0, 90); path.close(); canvas.drawPath(path, mPaint); } private void drawRightUp(Canvas canvas) { Path path = new Path(); path.moveTo(getWidth()-mHorizontalPadding, getHeight()/2); path.lineTo(getWidth(), getHeight()/2); path.lineTo(getWidth(), 0); path.lineTo(getWidth()/2, 0); path.lineTo(getWidth()/2, mVerticalPadding); path.arcTo(new RectF( mHorizontalPadding, mVerticalPadding, getWidth()-mHorizontalPadding, getHeight()-mVerticalPadding), 270, 90); path.close(); canvas.drawPath(path, mPaint); } }