⾃定义控件之绘图篇:路径及⽂字
⼀、创建路径
canvas 中绘制路径利⽤:
void drawPath (Path path, Paint paint)1、直线路径
void moveTo (float x1, float y1):
直线的开始点;即将直线路径的绘制点定在(x1,y1)的位置;
void lineTo (float x2, float y2):直线的结束点,⼜是下⼀次绘制直线路径的开始点;lineTo ()可以⼀直⽤;
void close ():如果连续画了⼏条直线,但没有形成闭环,调⽤Close()会将路径⾸尾点连接起来,形成闭环;
2、矩形路径
void addRect (float left, float top, float right, float bottom, Path.Direction dir)
void addRect (RectF rect, Path.Direction dir)
这⾥Path 类创建矩形路径的参数与上篇canvas 绘制矩形差不多,唯⼀不同的⼀点是增加了Path.Direction 参数;
Path.Direction 有两个值:
Path.Direction.CCW :是counter-clockwise 缩写,指创建逆时针⽅向的矩形路径;
Path.Direction.CW :是clockwise 的缩写,指创建顺时针⽅向的矩形路径;[java]
01. Paint paint=new Paint(); 02. paint.setColor(Color.RED); //设置画笔颜⾊ 03. paint.setStyle(Style.STROKE);//填充样式改为描边 04. paint.setStrokeWidth(5);//设置画笔宽度 05. 06. Path path = new Path(); 07. 08. veTo(10, 10); //设定起始点 09. path.lineTo(10, 100);//第⼀条直线的终点,也是第⼆条直线的起点 10. path.lineTo(300, 100);//画第⼆条直线 11. path.lineTo(500, 100);//第三条直线 12. path.close();//闭环 13. 14. canvas.drawPath(path, paint);
[java]
01. //先创建两个⼤⼩⼀样的路径 02. //第⼀个逆向⽣成 03. Path CCWRectpath = new Path(); 04. RectF rect1 = new RectF(50, 50, 240, 200); 05. CCWRectpath.addRect(rect1, Direction.CCW); 06. 07. //第⼆个顺向⽣成 08. Path CWRectpath = new Path(); 09. RectF rect2 = new RectF(290, 50, 480, 200); 10. CWRectpath.addRect(rect2, Direction.CW); 11. 12. //先画出这两个路径 13. canvas.drawPath(CCWRectpath, paint); 14. canvas.drawPath(CWRectpath, paint);
问:从效果图中,看不出顺时针⽣成和逆时针⽣成的任何区别,怎么会没区别呢?
答:当然没区别啦,⽆论正时针还是逆时针,仅仅是⽣成⽅式不同⽽已,矩形就那么⼤画出来的路径矩形当然与矩形⼀样⼤了。 问:那⽣成⽅式有什么区别呢?
答:⽣成⽅式的区别在于,依据⽣成⽅向排版的⽂字!后⾯我们会讲到⽂字,⽂字是可以依据路径排版的,那⽂字的⾏⾛⽅向就是依据路径的⽣成⽅向;
(有关⽂字的代码部分,可以先忽略,后⾯会讲到,这⾥只是让⼤家知道⽣成⽅式的⽤处)3、圆⾓矩形路径
void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)
这⾥有两个构造函数,部分参数说明如下:
text align center第⼀个构造函数:可以定制每个⾓的圆⾓⼤⼩:
float[] radii :必须传⼊8个数值,分四组,分别对应每个⾓所使⽤的椭圆的横轴半径和纵轴半径,如{x1,y1,x2,y2,x3,y3,x4,y4},其中,x1,y1对应第⼀个⾓的(左上⾓)⽤来产⽣圆⾓的椭圆的横轴半径和纵轴半径,其它类推……
第⼆个构造函数:只能构建统⼀圆⾓⼤⼩
float rx :所产⽣圆⾓的椭圆的横轴半径;
float ry :所产⽣圆⾓的椭圆的纵轴半径;[java]
01. //先创建两个⼤⼩⼀样的路径 02. //第⼀个逆向⽣成 03. Path CCWRectpath = new Path(); 04. RectF rect1 = new RectF(50, 50, 240, 200); 05. CCWRectpath.addRect(rect1, Direction.CCW); 06. 07. //第⼆个顺向⽣成 08. Path CWRectpath = new Path(); 09. RectF rect2 = new RectF(290, 50, 480, 200); 10. CWRectpath.addRect(rect2, Direction.CW); 11. 12. //先画出这两个路径 13. canvas.drawPath(CCWRectpath, paint); 14. canvas.drawPath(CWRectpath, paint); 15. 16. //依据路径写出⽂字 17. String text="风萧萧兮易⽔寒,壮⼠⼀去兮不复返"; 18. paint.setColor(Color.GRAY); 19. paint.setTextSize(35); 20. canvas.drawTextOnPath(text, CCWRect
path, 0, 18, paint);//逆时针⽣成 21. canvas.drawTextOnPath(text, CWRectpath, 0, 18, paint);//顺时针⽣成
4、圆形路径
void addCircle (float x, float y, float radius, Path.Direction dir)
参数说明:
float x :圆⼼X 轴坐标
float y :圆⼼Y
轴坐标
float radius :圆半径
5、椭圆路径
void addOval (RectF oval, Path.Direction dir)
参数说明:
RectF oval :⽣成椭圆所对应的矩形
Path.Direction :⽣成⽅式,与矩形⼀样,分为顺时针与逆时针,意义完全相同,不再重复[java]
01. Path path = new Path(); 02. RectF rect1 = new RectF(50, 50, 240, 200); 03. path.addRoundRect(rect1, 10, 15 , Direction.CCW); 04. 05. RectF rect2 = new RectF(290, 50, 480, 200); 06. float radii[] ={10,15,20,25,30,35,40,45}; 07. path.addRoundRect(rect2, radii, Direction.CCW); 08. 09. canvas.drawPath(path, paint);
[java]
01. Path path = new Path(); 02. path.addCircle(200, 200, 100, Direction.CCW); 03. canvas.drawPath(path, paint);
[java]
01. Path path = new Path(); 02. RectF rect = new RectF(50, 50, 240, 200); 03. path.addOval(rect, Direction.CCW); 04. canvas.drawPath(path, paint);
6、弧形路径
void addArc (RectF oval, float startAngle, float sweepAngle)
参数:
RectF oval :弧是椭圆的⼀部分,这个参数就是⽣成椭圆所对应的矩形;float startAngle :开始的⾓度,X 轴正⽅向为0
度float sweepAngel :持续的度数;
7、线段轨迹---待补充
void quadTo (float x1, float y1, float x2, float y2)
⼆、⽂字
1、Paint 相关设置[java]
01. Paint paint=new Paint(); 02. paint.setColor(Color.RED); //设置画笔颜⾊ 03. paint.setStyle(Style.STROKE);//填充样式改为描边 04. paint.setStrokeWidth(5);//设置画笔宽度 05. 06. Path path = new Path(); 07. RectF rect = new RectF(50, 50, 240, 200); 08. path.addArc(rect, 0, 100); 09. 10. canvas.drawPath(path, paint);//画出路径
⽰例1
:绘图样式的区别:
⽰例⼆:⽂字样式设置及倾斜度正负区别[html]
01. //普通设置 02. paint.setStrokeWidth (5);//设置画笔宽度 03. paint.setAntiAlias(true); //指定是否使⽤抗锯齿功能,如果使⽤,会使绘图速度变慢 04. paint.setStyle(Paint.Style.FILL);//绘图样式,对于设⽂字和⼏何图形都有效 05.
paint.setTextAlign(Align.CENTER);//设置⽂字对齐⽅式,取值:align.CENTER 、align.LEFT 或align.RIGHT 06. paint.setTextSize(12);//设置⽂字⼤⼩ 07. 08. //样式设置 09. paint.setFakeBoldText(true);//设置是否为粗体⽂字 10. paint.setUnderlineText(true);//设置下划线 11. paint.setTextSkewX((float) -0.25);//设置字体⽔平倾斜度,普通斜体字是-0.25 12. paint.setStrikeThruText(true);//设置带有删除线效果 13. 14. //其它设置 15. paint.setTextScaleX(2);//只会将⽔平⽅向拉伸,⾼度不会变 [java]
01. Paint paint=new Paint(); 02. paint.setColor(Color.RED); //设置画笔颜⾊ 03. 04. paint.setStrokeWidth (5);//设置画笔宽度 05. paint.setAntiAlias(true ); //指定是否使⽤抗锯齿功能,如果使⽤,会使绘图速度变慢 06. paint.setTextSize(80);//设置⽂字⼤⼩ 07. 08. //绘图样式,设置为填充 09. paint.setStyle(Paint.Style.FILL); 10. canvas.drawText("欢迎光临Harvic 的博客", 10,100, paint); 11. 12. //绘图样式设置为描边 13. paint.setStyle(Paint.Style.STROKE); 14. canvas.drawText("欢迎光临Harvic 的博客", 10,200, paint); 15. 16. //绘图样式设置为填充且描边 17. paint.setStyle(Paint.Style.FILL_AND_STROKE); 18. canvas.drawText("欢迎光临Harvic 的博客", 10,300, paint);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论