Android自定义View——绘制基本形状

1、画一个矩形

@Override
    protected void onDraw(@NonNull Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.FILL);

        //绘制一个宽度100dp、高50dp的矩形
        canvas.drawRect(0, 0, dpToPx(100), dpToPx(50), paint);
    }
Screenshot_20251101_164404.png

2、画一个圆角矩形

 @Override
    protected void onDraw(@NonNull Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.FILL);

        //绘制一个宽度100dp、高50dp的圆角矩形
        float radiusX = dpToPx(10);//X方向的圆角半径
        float radiusY = dpToPx(10);//y方向的圆角半径
        canvas.drawRoundRect(0, 0, dpToPx(100), dpToPx(50), radiusX, radiusY, paint);
    }
Screenshot_20251101_170115.png

3、Path
在Android中Path类是一个非常重要的类,用于绘制二维图形路径,它可以包含直线、二次曲线、贝塞尔曲线等,path类提供了一系列方法来定义路径

Path常见用法

 @Override
    protected void onDraw(@NonNull Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(dpToPx(2));

        //使用Path绘制一个半径为150dp的圆,并且距离左边10dp,顶部30dp
        float radius = dpToPx(150);//半径
        float left = dpToPx(10);//距离左边10dp
        float top = dpToPx(30);//距离顶部30dp

        Path path = new Path();
        //1、将路径的起点移动到9点钟位置
        float startX = left;//X轴等于左侧
        float startY = radius + top;//Y轴等于半径+顶部
        path.moveTo(startX, startY);

        //2、从当前点画二次贝塞尔曲线,控制点为(x1,y1),终点为(x2,y2)也就是12点位置
        float conX = left;//控制点为左侧顶点位置
        float conY = top;
        float endX = radius + left;//终点X轴等于半径+左侧
        float endY = top;//终点Y轴等于距离定位的位置
        path.quadTo(conX, conY, endX, endY);

        //3、这次的终点是3点钟位置
        float conXRight = 2 * radius + left;//控制点为右侧顶点位置,等于直径+左侧
        float conYRight = top;
        float endXRight = 2 * radius + left;//终点X轴等于直径+左侧
        float endYRight = radius + top;//终点Y轴等于半径+顶部
        path.quadTo(conXRight, conYRight, endXRight, endYRight);

        //4、这次的终点是6点钟位置
        float conXBottom = 2 * radius + left;//控制点在右下角
        float conYBottom = 2 * radius + top;
        float endXBottom = radius + left;//终点X轴为半径+左侧
        float endYBottom = 2 * radius + top;//终点Y轴直径+顶部
        path.quadTo(conXBottom, conYBottom, endXBottom, endYBottom);

        //5、终点回到起点,控制点在左下角
        float conXLeftBottom = left;
        float conYLeftBottom = 2 * radius + top;
        path.quadTo(conXLeftBottom, conYLeftBottom ,startX, startY);

        path.close();
        canvas.drawPath(path, paint);
    }
Screenshot_20251101_180252.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。