文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

View绘图之Path怎么使用

2023-07-05 21:41

关注

这篇文章主要讲解了“View绘图之Path怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“View绘图之Path怎么使用”吧!

使用Path绘制线

path类是一个非常有用的类,他可以预先在view上讲N个点连成一条“路径”,然后调用Canvas的drawPath(path,paint)即可沿着路径绘制图形,并且Android还为路径提供了pathEffect来绘制效果,pathEffect包含了如下子类
-ComposePathEffect
-ComnerPathEffect
-DashPathEffect
-DiscretePathEffect
-PathDashPathEffect
-SunPathEffect

一、我们这里绘制了7条线来分别介绍上面的几种子类都有什么用

代码如下

运行效果

View绘图之Path怎么使用

package tester.ermu.com.canvasdemo;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.ComposePathEffect;import android.graphics.CornerPathEffect;import android.graphics.DashPathEffect;import android.graphics.DiscretePathEffect;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PathDashPathEffect;import android.graphics.PathEffect;import android.graphics.SumPathEffect;import android.util.AttributeSet;import android.view.View;public class PathText extends View {    private float phase;    //线条的集合,    PathEffect[] effects = new PathEffect[7];    int[] colors;    private Paint paint;    Path path;    public PathText(Context context, AttributeSet attrs) {        super(context, attrs);//----------------------第一步-------------------------------        //创建一个画笔对象,设置画笔类型和画笔的大小        paint = new Paint();        paint.setStyle(Paint.Style.STROKE);        paint.setStrokeWidth(8);//------------------------第二步-----------------------------                path = new Path();        path.moveTo(0, 0);//--------------------------第三步---------------------------                  for (int i = 1; i <= 50; i++)        {            path.lineTo(i * 20, (float) Math.random() *100);        }        // 初始化7个颜色        colors = new int[] { Color.BLACK, Color.BLUE, Color.CYAN,                Color.GREEN, Color.MAGENTA, Color.RED, Color.GRAY };    }    public PathText(Context context){        super(context);    }//-------------------------第四步----------------------------    @Override    protected void onDraw(Canvas canvas){        // 将背景填充成白色        canvas.drawColor(Color.WHITE);// ---------------------------------------------------        //第一条线,什么效果都不加                 effects[0] = null;// ---------------------------------------------------                 effects[1] = new CornerPathEffect(10);// ---------------------------------------------------                effects[2] = new DiscretePathEffect(1.0f, 5.0f);// ---------------------------------------------------                effects[3] = new DashPathEffect(new float[] { 20, 10, 5, 10 },phase);// ---------------------------------------------------                Path p = new Path();        p.addRect(0, 0, 8, 8, Path.Direction.CCW);        effects[4] = new PathDashPathEffect(p, 12, phase,PathDashPathEffect.Style.ROTATE);// ---------------------------------------------------                // 初始化ComposePathEffect        effects[5] = new ComposePathEffect(effects[2], effects[4]);// ---------------------------------------------------                effects[6] = new SumPathEffect(effects[4], effects[3]);// ---------------------------------------------------        // 将画布移动到(8、8)处开始绘制        canvas.translate(16, 100);        // 依次使用7种不同路径效果、7种不同的颜色来绘制路径        for (int i = 0; i < effects.length; i++){            paint.setPathEffect(effects[i]);            paint.setColor(colors[i]);            canvas.drawPath(path, paint);            canvas.translate(0, 160);        }        // 改变phase值,形成动画效果// ---------------------------------------------------                phase += 1;        invalidate();    }}

二、不难看出其中每条线的属性和样式不一样,我在上面有 了很详细的讲解。

这里就不在介绍没个子类的属性了,代码很简单,步骤如下:

1、创建一个类继承view

2、定义一个线集合,用来添加我们绘制的7跳线,通过一个for循环依次绘制

3、上面代码中,在注释中前四步是准备工作,创建画笔、设置画布颜色、设定转折点的数量及每条线的颜色

4、引用子类对象 ,来为每条线添加不同的属性。

5、进行绘制,并且设置偏移量加1,并且设置重绘方法,实现一个动画效果

代码结构视图

View绘图之Path怎么使用

三、xxxTo()方法绘制(本章延伸知识)

一、直线绘制

@Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);          mPaint.setStrokeWidth(5);        // 实例化路径        mPath = new Path();        // 连接路径到点[100,100]        mPath.lineTo(100, 100);        // 绘制路径        canvas.drawPath(mPath, mPaint);    }

View绘图之Path怎么使用

    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);          mPaint.setStrokeWidth(5);        // 实例化路径        mPath = new Path();        mPath.moveTo(100, 100);          // 连接路径到点          mPath.lineTo(300, 100);          mPath.lineTo(400, 200);          mPath.lineTo(200, 200);         // 绘制路径        canvas.drawPath(mPath, mPaint);    }

View绘图之Path怎么使用

2 moveTo(float x, float y) +close()方法闭合曲线

 @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);          mPaint.setStrokeWidth(5);        // 实例化路径        mPath = new Path();        mPath.moveTo(100, 100);          // 连接路径到点          mPath.lineTo(300, 100);          mPath.lineTo(400, 200);          mPath.lineTo(200, 200);         // 闭合曲线        mPath.close();        // 绘制路径        canvas.drawPath(mPath, mPaint);    }

View绘图之Path怎么使用

二、画贝赛尔曲线

 @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);          mPaint.setStrokeWidth(5);        // 实例化路径        mPath = new Path();        // 移动起点至[100,100]          mPath.moveTo(100, 100);          // 连接路径到点          mPath.quadTo(200, 200, 300, 100);         canvas.drawPath(mPath, mPaint);    }

View绘图之Path怎么使用

View绘图之Path怎么使用

  @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);          mPaint.setStrokeWidth(5);        // 实例化路径        mPath = new Path();        // 移动起点至[100,100]          mPath.moveTo(100, 100);          // 连接路径到点          mPath.cubicTo(200, 200, 300, 0, 400, 100);          canvas.drawPath(mPath, mPaint);    }

View绘图之Path怎么使用

View绘图之Path怎么使用

三、画弧线

 @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);          mPaint.setStrokeWidth(5);        // 实例化路径        mPath = new Path();        // 移动起点至[100,100]          mPath.moveTo(100, 100);          // 连接路径到点          RectF oval = new RectF(100, 100, 200, 200);          mPath.arcTo(oval, 0, 90);         canvas.drawPath(mPath, mPaint);    }

View绘图之Path怎么使用

我们来看看效果:

 @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);          mPaint.setStrokeWidth(5);        // 实例化路径        mPath = new Path();        // 移动起点至[100,100]          mPath.moveTo(100, 100);          // 连接路径到点          RectF oval = new RectF(100, 100, 200, 200);          mPath.arcTo(oval, 0, 90,true);         canvas.drawPath(mPath, mPaint);    }

View绘图之Path怎么使用

四、Path中除了上面介绍的几个XXXTo方法外还有一套rXXXTo方法:

rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3)  rLineTo(float dx, float dy)  rMoveTo(float dx, float dy)  rQuadTo(float dx1, float dy1, float dx2, float dy2)

五、rXXXTo()方法和XXXTo()的区别

例如: 起点(100,100)到终点(200,200)

XXXTo绘制的距离就是,这里的move和lineTo的坐标都是对于画布左上角(0,0)来说。100到200的距离,绘制的总长度为00到200,也就是200距离

而rXXXTo绘制的距离就是相对于100起点,再绘制200的距离。绘制的总长度就是300

@Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);          mPaint.setStrokeWidth(5);        // 实例化路径        mPath = new Path();        // 移动点至[100,100]          mPath.moveTo(100, 100);          // 连接路径到点          mPath.lineTo(200, 200);         canvas.drawPath(mPath, mPaint);    }

View绘图之Path怎么使用

这里的move和lineTo的坐标都是对于画布左上角(0,0)来说的,是一个绝对坐标。而我们换为mPath.rLineTo(200, 200); 后呢?

View绘图之Path怎么使用

是不是感觉线段长了很多,因为这里的(200,200)是相对于开始点(100,100)来说的,是相对坐标。如果换算成绝对坐标就是绘制一条(100,100)到(300,300)之间的线段。

其实,这个前缀“r”也就是relative(相对)的简写!

六、addXXX方法

XXXTo方法可以连接Path中的曲线,而Path提供的另一系列addXXX方法则可以让我们直接往Path中添加一些曲线,比如

也就是说,通过addXXX方法添加到Path中的曲线是不会和上一次的曲线进行连接的:

  @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);        mPaint.setStrokeWidth(5);        // 实例化路径        mPath = new Path();        // 移动点至[100,100]        mPath.moveTo(100, 100);        // 连接路径到点        mPath.lineTo(200, 200);        // 添加一条弧线到Path中        RectF oval = new RectF(100, 100, 300, 400);        mPath.addArc(oval, 0, 90);        canvas.drawPath(mPath, mPaint);    }

View绘图之Path怎么使用

如图和代码所示,虽然我们先绘制了由[100,100]到[200,200]的线段,但是在我们往Path中添加了一条弧线后该弧线并没与线段连接。

除了addArc,Path还提供了一系列的add方法:

addCircle(float x, float y, float radius, Path.Direction dir)

addOval(float left, float top, float right, float bottom, Path.Direction dir)

addRect(float left, float top, float right, float bottom, Path.Direction dir)

addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Path.Direction dir)

这些方法和addArc有很明显的区别,就是多了一个Path.Direction参数,其他呢都大同小异,除此之外不知道大家还发现没有,addArc是往Path中添加一段弧,说白了就是一条开放的曲线,而上述几种方法都是一个具体的图形,或者说是一条闭合的曲线,Path.Direction的意思就是标识这些闭合曲线的闭合方向。Path.Direction只有两个常量值CCW和CW分别表示逆时针方向闭合和顺时针方向闭合

例如顺时针方向闭合

@Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        mPaint.setStyle(Paint.Style.STROKE);        // 实例化路径        mPath = new Path();        // 移动起点至[100,100]        mPath.moveTo(100, 100);        // 添加一条弧线到Path中          RectF oval = new RectF(100, 100, 300, 400);          mPath.addOval(oval, Path.Direction.CW);         canvas.drawPath(mPath, mPaint);        mPaint.setTextSize(50);        // 绘制路径上的文字          canvas.drawTextOnPath("123456789", mPath, 0, 0, mPaint);     }

View绘图之Path怎么使用

如果我们换作:mPath.addOval(oval, Path.Direction.CCW);

View绘图之Path怎么使用

感谢各位的阅读,以上就是“View绘图之Path怎么使用”的内容了,经过本文的学习后,相信大家对View绘图之Path怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯