Canvas.drawPath

先画一个圆,再画十字线,通过十字线的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);

    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容