先画一个圆,再画十字线,通过十字线的4个点drawPath,然后把画布再旋转45度,一个正的正方形
图:

image.png
package com.ity.tyvoddemo.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* author : wenPengHu
* date : 2026/2/26 15:36
* description :画一个圆,再画一个十字线
*/
public class SquareView extends View {
private Paint circlePaint = null; //圆
private int circleStrokeWidth = 20;
private Paint crossHairPaint = null; //十字线
private Paint squarPaint = null; //方线
private double mWidth = 0;
private double mHeight = 0;
private double radius = 0;//半径
double cx, cy; //原点(起始点)
public SquareView(Context context) {
this(context, null);
}
public SquareView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public SquareView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public SquareView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = MeasureSpec.getSize(widthMeasureSpec);
mHeight = MeasureSpec.getSize(heightMeasureSpec);
radius = (Math.min(mWidth, mHeight)/2)-circleStrokeWidth;
//对于Android View 坐标系屏幕的左上角是0,0是起始点
cx = Math.min(mWidth, mHeight)/2;
cy = Math.min(mWidth, mHeight)/2;
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle((float) cx, (float) cy, (float) radius,circlePaint);
canvas.drawPoint((float) cx, (float) cy,circlePaint);
double halfCircleStrokeWidth = (double) circleStrokeWidth /2;
canvas.drawLine((float) (cx-radius+halfCircleStrokeWidth), (float) (cy), (float) (cx+radius-halfCircleStrokeWidth), (float) (cy),crossHairPaint); //水平线
canvas.drawLine((float) (cx), (float) (cy-radius+halfCircleStrokeWidth), (float) (cx), (float) (cy+radius-halfCircleStrokeWidth),crossHairPaint); //垂直线
canvas.save();
//找出crossHair的四个点
canvas.rotate(45F, (float) cx, (float) cy);
Path path = new Path();
path.moveTo((float) cx, (float) (cy+radius-halfCircleStrokeWidth));
path.lineTo((float) cx,(float) (cy+radius-halfCircleStrokeWidth));
path.lineTo((float) (cx+radius-halfCircleStrokeWidth), (float) cy);
path.lineTo((float) cx, (float) (cy-radius+halfCircleStrokeWidth));
path.lineTo((float) (cx-radius+halfCircleStrokeWidth), (float) (cy));
path.close();
canvas.drawPath(path,squarPaint);
canvas.restore();
}
public void init() {
circlePaint = new Paint();
circlePaint.setAntiAlias(true);
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setStrokeWidth(circleStrokeWidth);
circlePaint.setStrokeCap(Paint.Cap.BUTT);
circlePaint.setColor(Color.BLACK);
crossHairPaint = new Paint();
crossHairPaint.setAntiAlias(true);
crossHairPaint.setStrokeCap(Paint.Cap.BUTT);
crossHairPaint.setStyle(Paint.Style.STROKE);
crossHairPaint.setStrokeWidth(4);
crossHairPaint.setColor(Color.RED);
squarPaint = new Paint();
squarPaint.setAntiAlias(true);
squarPaint.setStrokeCap(Paint.Cap.BUTT);
squarPaint.setStyle(Paint.Style.STROKE);
squarPaint.setStrokeWidth(4);
squarPaint.setColor(Color.BLUE);
}
}