【Android自定义View】绘图之Path篇(二)

栏目: Android · 发布时间: 7年前

内容简介:上一篇,我们说了绘制基本的几何图形,这一篇我们说说绘制路径(Path)这里主要用到的方法是主要用到的方法

上一篇,我们说了绘制基本的几何图形,这一篇我们说说绘制路径(Path)

这里主要用到的方法是 canvas.drawPath(path, paint);

  • 1.直线

主要用到的方法

moveTo(float x, float y) 起始点

lineTo(float x, float y) 当前点直线的结束点,也是下条直线的起始点

close() 闭合

Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.FILL);

        Path path = new Path();
        path.moveTo(20, 20); //设定起始点
        path.lineTo(300, 100);//第1条直线
        path.lineTo(300, 300);//第2条直线
        path.close();//闭合
        canvas.drawPath(path, paint);
复制代码
【Android自定义View】绘图之Path篇(二)
  • 2.矩形

addRect(RectF rect, Direction dir)

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

RectF 和 float left, float top, float right, float bottom 是一样的, Direction 有2种方式, CW 和 CCW ,其中 CW 表示顺时针, CCW 表示逆时针

Path ccw = new Path();
        RectF rect1 =  new RectF(50, 50, 300, 300);
        ccw.addRect(rect1, Path.Direction.CCW);//逆时针

        Path cw = new Path();
        RectF rect2 =  new RectF(350, 50, 600, 300);
        cw.addRect(rect2, Path.Direction.CW);//顺时针

        canvas.drawPath(ccw, paint);
        canvas.drawPath(cw, paint);
复制代码
【Android自定义View】绘图之Path篇(二)

看上去好像是一样的?其实是过程不一样,结果一样,细节的话,我们后面再说。

  • 3.圆角矩形

addRoundRect(RectF rect, float rx, float ry, Direction dir)

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

addRoundRect(RectF rect, float[] radii, Direction dir)

addRoundRect(float left, float top, float right, float bottom, float[] radii,Direction dir)

其中, radii 只能传入8个数值,多于8个不会有效果, rx 表示x方向的半径, ry 表示y方向的半径

Path ccw = new Path();
        RectF rect1 = new RectF(50, 50, 500, 500);
        float[] radii = {5, 20, 50, 100, 150, 200, 250, 300};
        ccw.addRoundRect(rect1, radii, Path.Direction.CCW);


        Path cw = new Path();
        RectF rect2 = new RectF(550, 50, 1000, 500);
        cw.addRoundRect(rect2, 10, 100, Path.Direction.CCW);

        canvas.drawPath(ccw, paint);

        paint.setColor(Color.BLUE);
        canvas.drawPath(cw, paint);
复制代码
【Android自定义View】绘图之Path篇(二)
  • 4.圆形

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

Path cw = new Path();
        cw.addCircle(200, 200, 100, Path.Direction.CW);
        canvas.drawPath(cw, paint);
复制代码
【Android自定义View】绘图之Path篇(二)
  • 5.椭圆

addOval(RectF oval, Direction dir)

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

Path cw = new Path();
        RectF rect1 = new RectF(50, 50, 500, 300);
        cw.addOval(rect1, Path.Direction.CW);
        canvas.drawPath(cw, paint);
复制代码
【Android自定义View】绘图之Path篇(二)
  • 6.弧形

addArc(RectF oval, float startAngle, float sweepAngle)

addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle)

startAngle 开始的角度,X轴正方向为0度

sweepAngel 持续的度数

Path cw = new Path();
        RectF rect1 = new RectF(50, 50, 500, 300);
        cw.addArc(rect1, 0, 180);
        canvas.drawPath(cw, paint);
复制代码
【Android自定义View】绘图之Path篇(二)
  • 7.带轨迹的文字

drawTextOnPath(String text, Path path, float hOffset,float vOffset, Paint paint)

drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)

index 表示开始位置

count 表示结束位置,可以对文字进行截取

hOffset 表示绘制位置离开始位置的偏移量

vOffset 表示绘制位置离开路径的偏移量

String text = "ABCDEFGHIJKLMNOPQRSTYVWXYZ";
        paint.setTextSize(72);

        Path ccw = new Path();
        RectF rect1 = new RectF(50, 50, 500, 500);
        ccw.addRect(rect1, Path.Direction.CCW);//逆时针

        Path cw = new Path();
        RectF rect2 = new RectF(650, 50, 1100, 500);
        cw.addRect(rect2, Path.Direction.CW);//顺时针

        canvas.drawPath(ccw, paint);
        canvas.drawPath(cw, paint);

        canvas.drawTextOnPath(text, ccw, 0, 0, paint);

        canvas.drawTextOnPath(text, cw, 0, 0, paint);
复制代码
【Android自定义View】绘图之Path篇(二)
这里就可以明显的看出 CCW 和 CW

的区别了

修改 hOffset 和 vOffset

String text = "ABCDEFGHIJKLMNOPQRSTYVWXYZ";
        paint.setTextSize(72);

        Path ccw = new Path();
        RectF rect1 = new RectF(50, 50, 500, 500);
        ccw.addRect(rect1, Path.Direction.CCW);//逆时针

        Path cw = new Path();
        RectF rect2 = new RectF(650, 50, 1100, 500);
        cw.addRect(rect2, Path.Direction.CW);//顺时针

        canvas.drawPath(ccw, paint);
        canvas.drawPath(cw, paint);

        canvas.drawTextOnPath(text, ccw, 100, 0, paint);

        canvas.drawTextOnPath(text, cw, 0, 100, paint);
复制代码
【Android自定义View】绘图之Path篇(二)

可以看到, hOffset 表示绘制位置离开始位置的偏移量, vOffset 表示绘制位置离开路径的偏移量, vOffset 越大,离圆心越近。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

超越门户

超越门户

吴晨光 / 中国人民大学出版社 / 2015-4-17 / 39.80

在这个PC端影响力下降、人们对手机的依赖与日俱增的时代,这种探索的意义非同寻常,可以说是试图树立新媒体时代的行业标准。 ——陈彤(小米内容投资与运营副总裁、新浪网前总编辑、资深网络媒体人) 我将对此书的阅读,视作对往日岁月的怀念,它提醒我,自己曾 投身于多么富有蓬勃朝气和探索精神的事业。而对这种事业的原则、逻辑和方法的继承和继续学习,对于互联网时代的企业形象塑造 ,同样有融会变通的参考......一起来看看 《超越门户》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器