我想在画布上绘制一个用颜色(或位图)填充并带有笔触的圆角矩形,但是没有某些选定的角,并且在某些选定的侧面也没有边框。任何想法,我怎么能做到这一点?
最佳答案
您可以将绘图过程分为两部分。
绘制填充区域
当尝试绘制标准sdk API不支持的形状时,Canvas.drawPath方法将是一个很好的方法。您可以定义四个变量来表示四个角的半径。
Path path = new Path();
Rect drawingRect = {the rect area you want to draw}
RectF topLeftArcBound = new RectF();
RectF topRightArcBound = new RectF();
RectF bottomLeftArcBound = new RectF();
RectF bottomRightArcBound = new RectF();
topRightArcBound.set(drawingRect.right - topRightRadius * 2, drawingRect.top, drawingRect.right, drawingRect.top + topRightRadius * 2);
bottomRightArcBound.set(drawingRect.right - bottomRightRadius * 2, drawingRect.bottom - bottomRightRadius * 2, drawingRect.right, drawingRect.bottom);
bottomLeftArcBound.set(drawingRect.left, drawingRect.bottom - bottomLeftRadius * 2, drawingRect.left + bottomLeftRadius * 2, drawingRect.bottom);
topLeftArcBound.set(drawingRect.left, drawingRect.top, drawingRect.left + topLeftRadius * 2, drawingRect.top + topLeftRadius * 2);
path.reset();
path.moveTo(drawingRect.left + topLeftRadius, drawingRect.top);
//draw top horizontal line
path.lineTo(drawingRect.right - topRightRadius, drawingRect.top);
//draw top-right corner
path.arcTo(topRightArcBound, -90, 90);
//draw right vertical line
path.lineTo(drawingRect.right, drawingRect.bottom - bottomRightRadius);
//draw bottom-right corner
path.arcTo(bottomRightArcBound, 0, 90);
//draw bottom horizontal line
path.lineTo(drawingRect.left - bottomLeftRadius, drawingRect.bottom);
//draw bottom-left corner
path.arcTo(bottomLeftArcBound, 90, 90);
//draw left vertical line
path.lineTo(drawingRect.left, drawingRect.top + topLeftRadius);
//draw top-left corner
path.arcTo(topLeftArcBound, 180, 90);
path.close();
paint.setStyle(Paint.Style.FILL);
canvas.drawPath(path, paint);
您可以将所选角的半径设置为零
画边框
边框包含八个部分:
左上角
顶线
右上角
右行
右下角
底线
左下角
左行
使用int值包含选定的部分将是一个好主意
私有静态最终int TOP_LEFT_CORNER = 0x1;
私有静态最终int TOP_LINE = 0x2;
私有静态最终整数TOP_RIGHT_CORNER = 0x4;
私有静态最终int RIGHT_LINE = 0x8;
私有静态最终int BOTTOM_RIGHT_CORNER = 0x10;
私有静态最终int BOTTOM_LINE = 0x20;
私有静态最终int BOTTOM_LEFT_CORNER = 0x40;
私有静态最终int LEFT_LINE = 0x80;
private int selectedParts = TOP_LEFT_CORNER | TOP_LINE | TOP_RIGHT_CORNER;
现在我们可以根据selectedParts绘制边框:
paint.setStyle(Paint.Style.STROKE);
if((selectedParts和TOP_LINE)> 0){
canvas.drawLine(drawingRect.left + topLeftRadius,drawingRect.top,drawingRect.right-topRightRadius,drawingRect.top);
}
if((selectedParts&TOP_RIGHT_CORNER)> 0){
canvas.drawArc(topRightArcBound,-90,90,false,paint);
}
if((selectedParts&RIGHT_LINE)> 0){
canvas.drawLine(drawingRect.right,drawingRect.top + topRightRadius,drawingRect.right,drawingRect.bottom-bottomRightRadius,paint);
}
if((selectedParts&BOTTOM_RIGHT_CORNER)> 0){
canvas.drawArc(bottomRightArcBound,0,90,false,paint);
}
if((selectedParts&BOTTOM_LINE)> 0){
canvas.drawLine(drawingRect.right-bottomRightRadius,drawingRect.bottom。drawingRect.left + bottomLeftRadius,drawingRect.bottom,paint);
}
if((selectedParts&BOTTOM_LEFT_CORNER)> 0){
canvas.drawArc(bottomLeftArcBound,90,90,false,paint);
}
if((selectedParts&LEFT_LINE)> 0){
canvas.drawLine(drawingRect.left,drawingRect.bottom-bottomLeftRadius,drawingRect.left,drawingRect.top + topLeftRadius,paint);
}
if((selectedParts&TOP_LEFT_CORNER)> 0){
canvas.drawArc(topLeftArcBound,180,90,false,paint);
}