自定义view:
public class MyView extends View {
private static final int DEFAULT_WIDTH = 100;
private static final int DEFAULT_HEIGHT = 100;
private Paint rectPaint;
private Rect rect;
private Paint linePaint;
public MyView(Context context) {
super(context);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
rectPaint = new Paint();
rectPaint.setColor(Color.RED);
rectPaint.setStyle(Paint.Style.STROKE);
rectPaint.setStrokeWidth(100);
rect = new Rect(0, 0, 600, 600);
linePaint = new Paint();
linePaint.setColor(Color.BLACK);
linePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getProperSize(DEFAULT_WIDTH, widthMeasureSpec);
int height = getProperSize(DEFAULT_HEIGHT, heightMeasureSpec);
setMeasuredDimension(width, height);
}
private int getProperSize(int defaultSize, int measureSpec) {
int result;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = defaultSize;
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(result, size);
}
}
return result;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(rect, rectPaint);
canvas.drawLine(600, 0, 600, 600, linePaint);
canvas.drawLine(0, 600, 600, 600, linePaint);
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<example.com.myping.MyView
android:layout_width="300dp"
android:layout_height="300dp" />
</RelativeLayout>
情况一:当把画笔设置rectPaint.setStyle(Paint.Style.STROKE);时
效果图:
情况二、当把画笔设置rectPaint.setStyle(Paint.Style.FILL);时
效果图:
黑色线和红色区域正好重合。说明Paint.Style.FILL时画的区域正好是view的区域。
情况三、当把画笔设置rectPaint.setStyle(Paint.Style.FILL_AND_STROKE);时
效果图:
结论:
1、setStrokeWidth只对rectPaint.setStyle(Paint.Style.STROKE);和rectPaint.setStyle(Paint.Style.FILL_AND_STROKE)起作用。
2、setStrokeWidth设置画笔宽度后,画笔(红色区域)的去掉外面一半围成的区域才是view的实际区域。
3、调用setstrokewidth(float)为画笔设置粗细,如canvas.drawRect(0,0,100,100);其中画笔宽度的一半在rect内,一半在rect外面。
其他:
情况四、当rectPaint.setStyle(Paint.Style.STROKE);时,保证view的宽度为600而且边界宽度一致,则代码如下:
public class MyView extends View {
private static final int DEFAULT_WIDTH = 100;
private static final int DEFAULT_HEIGHT = 100;
private static final int DEFAULT_STROKE_WIDTH = 100;
private Paint rectPaint;
private RectF rect;
private Paint linePaint;
public MyView(Context context) {
super(context);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
rectPaint = new Paint();
rectPaint.setColor(Color.RED);
rectPaint.setStyle(Paint.Style.STROKE);
rectPaint.setStrokeWidth(DEFAULT_STROKE_WIDTH);
rect = new RectF(DEFAULT_STROKE_WIDTH / 2, DEFAULT_STROKE_WIDTH / 2,
600 - DEFAULT_STROKE_WIDTH / 2, 600 - DEFAULT_STROKE_WIDTH / 2);
linePaint = new Paint();
linePaint.setColor(Color.BLACK);
linePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getProperSize(DEFAULT_WIDTH, widthMeasureSpec);
int height = getProperSize(DEFAULT_HEIGHT, heightMeasureSpec);
setMeasuredDimension(width, height);
}
private int getProperSize(int defaultSize, int measureSpec) {
int result;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = defaultSize;
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(result, size);
}
}
return result;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRoundRect(rect, 10, 10, rectPaint);
canvas.drawLine(600, 0, 600, 600, linePaint);
canvas.drawLine(0, 600, 600, 600, linePaint);
}
}