自定义View之ondraw绘制

这篇博客探讨了自定义View中ondraw方法的使用,重点在于Canvas的drawXXX()和Path、Paint的运用。通过实践,作者绘制了扇形图和直方图两个图形示例,详细介绍了绘制过程,同时提供了相关参考链接以供深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统的复习了一下ondraw绘制的基础知识,还绘制了几个图形作为练习,这篇博客记录了下常用的绘制基础方法,和两个图形demo,一个是扇形图,一个是直方图。

自定义绘制最常用的方式是重写绘制方法onDraw(),ondraw()的关键是 Canvas 的使用
Canvas分为两方面。
1,drawXXX(),关键Path,Paint。
2,辅助方法,范围裁切和几何变换。
还可以使用不同的绘制方法来控制遮盖关系

下面代码直接演示drawXXX()常用方法和Path常用方法,,因为我是边写边运行测试,试看每个方法的效果,所以都依次注释了。


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

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//在绘制的时候,往往需要开启抗锯齿来让图形和文字的边缘更加平滑

        paint.setColor(Color.BLUE);
        paint.setAntiAlias(true);// 来动态开关抗锯齿

        /**
         * 三种模式FILL, STROKE 和  FILL_AND_STROKE 。它的默认值是 FILL,填充模式。
         * FILL 是填充模式,STROKE 是画线模式(即勾边模式),FILL_AND_STROKE 是两种模式一并使用:既画线又填充。
         */
        paint.setStyle(Paint.Style.FILL);//不设置默认是实心,绘制模式改为画线模式
        paint.setStrokeWidth(1);

        canvas.drawCircle(150, 150, 100, paint);//画圆
        /**
         *  重载方法 drawRect(RectF rect, Paint paint) 和 drawRect(Rect rect, Paint paint) ,
         *  让你可以直接填写 RectF 或 Rect 对象来绘制矩形。
         */
        canvas.drawRect(100, 100, 300, 400, paint);//画矩形

        paint.setStrokeWidth(20);//点的大小
        paint.setStrokeCap(Paint.Cap.ROUND);//点的形状 BUTT,SQUARE ROUND,前两参数是方的,后一个圆的
        canvas.drawPoint(100, 100, paint);//画点

        float[] points = {0, 0, 50, 50, 50, 100, 100, 50, 100, 100, 150, 50, 150, 100};
        canvas.drawPoints(points, 2 /* 跳过两个数,即前两个 0 */, 8 /* 一共绘制 8 个数(4 个点)*/, paint); //批量花点

        /**
         * 重载方法 drawOval(RectF rect, Paint paint),让你可以直接填写 RectF 来绘制椭圆
         */
        canvas.drawOval(100, 50, 500, 200, paint);//椭圆

        canvas.drawLine(200, 200, 800, 500, paint);//画线 ,参数 分别是线的起点和终点坐标。

        float[] points2 = {20, 20, 120, 20, 70, 20, 70, 120, 20, 120, 120, 120, 150, 20, 250, 20, 150, 20, 150, 120, 250, 20, 250, 120, 150, 120, 250, 120};
        canvas.drawLines(points2, paint);//批量画直线

        /**
         * 重载方法 drawRoundRect(RectF rect, float rx, float ry, Paint paint),让你可以直接填写 RectF 来绘制圆角矩形。
         */
        canvas.drawRoundRect(400, 50, 700, 200, 30, 30, paint);//画圆角矩形,四条边的坐标,rx 和 ry 是圆角的横向半径和纵向半径。

        /**
         * float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
         * left, top, right, bottom 描述的是这个弧形所在的椭圆
         * startAngle 是弧形的起始角度(x 轴的正向,即正右的方向,是 0 度的位置;顺时针为正角度,逆时针为负角度)
         * sweepAngle 是弧形划过的角度
         * useCenter 表示是否连接到圆心,如果不连接到圆心,就是弧形,如果连接到圆心,就是扇形
         */
        canvas.drawArc(50, 0, 300, 250, 10, 260, true, paint);//绘制弧形或扇形

        /**
         * drawPath(Path path, Paint paint) 画自定义图形,这个方法有点复杂
         * Path 可以描述直线、二次曲线、三次曲线、圆、椭圆、弧形、矩形、圆角矩形。把这些图形结合起来,就可以描述出很多复杂的图形。
         */
        Path path = new Path(); // 初始化 Path 对象
        // 使用 path 对图形进行描述(这段描述代码不必看懂)
        path.addArc(200, 200, 400, 400, -225, 225);
        path.arcTo(400, 200, 600, 400, -180, 225, false);
        path.lineTo(400, 542);
        canvas.drawPath(path, paint); // 绘制出 path 描述的图形(心形)

        /**
         * Path 有两类方法,一类是直接描述路径的,另一类是辅助的设置或计算。
         * Path 方法第一类:直接描述路径,还可以细分为两组:添加子图形和画线(直线或曲线)
         * 第一组: addXxx() ——添加子图形
         */

        /**
         *最后一个参数 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值