Paint  画笔 ,即用来绘制图形的"笔"

前面我们知道了Paint的一些基本用法:

paint.setAntiAlias(true);//抗锯齿功能
paint.setColor(Color.RED); //设置画笔颜色
paint.setStyle(Style.FILL);//设置填充样式
paint.setStrokeWidth();//设置画笔宽度 ,单位px
paint.setShadowLayer(, , , Color.GREEN);//设置阴影

不过我们会发现,这样画出的线条都是笔笔直直的,能满足需求,但是美观上并不好看。

这就需要使用到Paint类 更多的一些方法了

首先,看下最简单设置的线条

Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
paint.setStrokeWidth(50); Path path = new Path();
path.moveTo(100,500);
path.lineTo(200,200);
path.lineTo(300,500);
//绘制一个红色,线条宽度50px 的折线
canvas.drawPath(path,paint);

一、线条路径样式 

public void setPathEffect(PathEffect effect);

  设置路径样式;取值类型是所有派生自PathEffect的子类

 从第二个到最后一个 ,每一个都表示一个样式,其中用的最多的是 CornerPathEffect--圆形拐角效果  ,DashPathEffect——虚线效果 

 (1)、CornerPathEffect--圆形拐角效果

  new CornerPathEffect(float radius) // radius 表示弯曲的半径程度

Path path = new Path();
path.moveTo(,);
path.lineTo(,);
path.lineTo(,);
//绘制一个红色,线条宽度50px 的折线
paint.setPathEffect(new CornerPathEffect());
canvas.drawPath(path,paint);

  

可以看到原来直线的折角 现在已经有一个弯曲程度了

拓展:我们可以根据这个方法来进行曲线图的实现

  (2)、DashPathEffect——虚线效果 

public DashPathEffect(float intervals[], float phase)
intervals[]:表示组成虚线的各个线段的长度;整条虚线就是由intervals[]中这些基本线段循环组成的。
phase: 开始绘制的偏移值

 注意: intervals[ ] 里面个数不限,但至少为2个。

     可以为单数个,也可以为双数个,如果为单数个,多出来的最后一个无效果

         双数个,表示一个实现长度,一个空线长度

     比如  new DashPathEffect(new float[]{30,10,20,10},10);

     那么每一段都分为4部分,先是30px的实线,再是10px的空心线,再是20px的实线,再是10px的空线

Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
paint.setStrokeWidth();
Path path = new Path();
path.moveTo(,);
path.lineTo(,); paint.setPathEffect(new DashPathEffect(new float[]{,,,},));
canvas.drawPath(path,paint);

至于其他的效果,大家可以自己尝试 。

二、ComposePathEffect与SumPathEffect 叠加路径效果

从英文上可以看出这两个方法是用来合并路径效果的,但既然是两个方法,就有相应的区别

  (1)、ComposePathEffect

    这种合并路径效果是 先将paint 设置成第二个参数的路径效果,然后在此基础上 在设置成第一个参数对应的路径效果

    我们给一个线条,设置圆形拐角路径 和 一个虚线路径看一下

Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
paint.setStrokeWidth(3);
Path path = new Path();
path.moveTo(100,600);
path.lineTo(200,200);
path.lineTo(300,600);
//虚线路径
DashPathEffect dashPathEffect = new DashPathEffect(new float[]{30, 10, 20, 10}, 0);
//圆角拐点路径
CornerPathEffect cornerPathEffect = new CornerPathEffect(10);
//合并后的路径
ComposePathEffect composePathEffect = new ComposePathEffect(dashPathEffect, cornerPathEffect);
//设置路径
paint.setPathEffect(composePathEffect);
canvas.drawPath(path,paint);

  (2)、SumPathEffect 

    这种合并路径效果是 分别将两个路径的效果叠加的显示出现

    我们给一个线条,设置圆形拐角路径 和 一个虚线路径看一下

Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
paint.setStrokeWidth();
Path path = new Path();
path.moveTo(,);
path.lineTo(,);
path.lineTo(,);
//虚线路径
DashPathEffect dashPathEffect = new DashPathEffect(new float[]{, , , }, );
//圆角拐点路径
CornerPathEffect cornerPathEffect = new CornerPathEffect();
//合并后的路径
SumPathEffect sumPathEffect = new SumPathEffect(dashPathEffect,cornerPathEffect);
//设置路径
paint.setPathEffect(sumPathEffect);
canvas.drawPath(path,paint);

可以看出  一个虚线路径 和 一个 圆形拐角路径 叠加显示起来的效果

三、setStrokeCap(Paint.Cap cap)

  设置线帽样式,取值有Cap.ROUND(圆形线帽)、Cap.SQUARE(方形线帽)、Paint.Cap.BUTT(无线帽)

  线冒,可以理解为一条线两个端点,设置线冒样式使线条两端不看起来不那么死板

  这里绘制3条不同 样式的直线 来看一下效果

  

Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
paint.setStrokeWidth(); Path pathBUTT = new Path();
pathBUTT.moveTo(,);
pathBUTT.lineTo(,);
paint.setStrokeCap(Paint.Cap.BUTT);
canvas.drawPath(pathBUTT,paint); Path pathSQUARE = new Path();
pathSQUARE.moveTo(,);
pathSQUARE.lineTo(,);
paint.setStrokeCap(Paint.Cap.SQUARE);
canvas.drawPath(pathSQUARE,paint); Path pathROUND = new Path();
pathROUND.moveTo(,);
pathROUND.lineTo(,);
paint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawPath(pathROUND,paint);

  

四、setStrokeJoin(Paint.Join join)

  设置结合处效果取值:

1、Join.MITER(结合处为锐角)
2、Join.Round(结合处为圆弧)
3、Join.BEVEL(结合处为直线)

  举例:

Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStrokeWidth();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true); Path pathROUND = new Path();
pathROUND.moveTo(,);
pathROUND.lineTo(,);
pathROUND.lineTo(,);
paint.setStrokeJoin(Paint.Join.ROUND);
canvas.drawPath(pathROUND,paint); Path pathMITER = new Path();
pathMITER.moveTo(,);
pathMITER.lineTo(,);
pathMITER.lineTo(,);
paint.setColor(Color.GREEN);
paint.setStrokeJoin(Paint.Join.MITER);
canvas.drawPath(pathMITER,paint); Path path = new Path();
path.moveTo(,);
path.lineTo(,);
path.lineTo(,);
paint.setColor(Color.BLUE);
paint.setStrokeJoin(Paint.Join.BEVEL);
canvas.drawPath(path,paint);

自定义控件详解(四):Paint 画笔路径效果的更多相关文章

  1. 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析

    第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...

  2. WindowsPhone自定义控件详解(二) - 模板类库分析

    转自:http://blog.csdn.net/mr_raptor/article/details/7251948 WindowsPhone自定义控件详解(一) - 控件类库分析 上一节主要分析了控件 ...

  3. Spring配置文件详解 – applicationContext.xml文件路径

    Spring配置文件详解 – applicationContext.xml文件路径 Java编程                 spring的配置文件applicationContext.xml的默 ...

  4. .NET DLL 保护措施详解(四)各操作系统运行情况

    我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...

  5. logback -- 配置详解 -- 四 -- <filter>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  6. pika详解(四) channel 通道

    pika详解(四) channel 通道   本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权 ​ channel通道 通道 ...

  7. View绘制详解(四),谝一谝layout过程

    上篇博客我们介绍了View的测量过程,这只是View显示过程的第一步,第二步就是layout了,这个我们一般译作布局,其实就是在View测量完成之后根据View的大小,将其一个一个摆放在ViewGro ...

  8. 自定义控件详解(二):Path类 相关用法

    Path:路径 绘制路径:void drawPath (Path path, Paint paint) Path 可以绘制的路径 一.直线路径 1.基本方法 void moveTo (float st ...

  9. C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)

    前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...

随机推荐

  1. 微信小程序如何套用iconfont

    前言 如果你在开发微信时,没有图标的话,可以到http://www.iconfont.cn/ 官方下使用图标,那么我们去使用一些吧,到官方网址下点击使用~ 下载代码即可使用,看看下载的文件吧. 如图可 ...

  2. PHP错误处理函数register_shutdown_function

    当程序在线上运行时,如果遇到BUG,想不在前端输出错误信息,同时能及时邮件通知开发者,register_shutdown_function函数就可以派上用场了. 注册一个会在脚本执行完成或者 exit ...

  3. HTTP请求时间参数设置

    1. JSON 2019-01-18 18:36:35 2. Postman 2019/01/18 18:36:35

  4. Spring Boot Tomcat配置详解

    参数配置容器 server.xx开头的是所有servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数,其它类似. 所有参数绑定配置类:org.springframe ...

  5. fast.ai(零)windows + pytorch 0.4

    一.下载 git clone https://github.com/fastai/fastai.git 或者直接下载下来 二.安装pytorch 去官网安装建议安装即可 https://pytorch ...

  6. Jenkins和gitlab集成自动构建

    Jenkins安装插件 Jenkins上需要安装如下插件 Gitlab Hook Plugin,GitLab Plugin Job配置 在需要自动触发的Job中 选择Build Triggers进行如 ...

  7. 采用太平洋AI的DINK框架一键运行3D点云识别,一键训练深度学习模型

    DINK安装视频教程:  http://fp-ai.com/video_details.html?id=072b030ba126b2f4b2374f342be9ed44 DINK一键启动视频教程:   ...

  8. Kafka项目实战-用户日志上报实时统计之应用概述

    1.概述 本课程的视频教程地址:<Kafka实战项目之应用概述> 本课程是通过一个用户实时上报日志来展开的,通过介绍 Kafka 的业务和应用场景,并带着大家搭建本 Kafka 项目的实战 ...

  9. Java并发编程笔记之FutureTask源码分析

    FutureTask可用于异步获取执行结果或取消执行任务的场景.通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过Fu ...

  10. 【杂谈】线程中断——Interrupt

    前言 以前有一个错误的认识,以为中断操作都会抛出异常,后来才发现并不是这样,所以今天就来做一个关于中断的总结. 如何关闭线程 已被弃用的Stop方法 早期,Thread类中有一个stop方法,用于强行 ...