自定义控件详解(四):Paint 画笔路径效果
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 画笔路径效果的更多相关文章
- 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析
第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...
- WindowsPhone自定义控件详解(二) - 模板类库分析
转自:http://blog.csdn.net/mr_raptor/article/details/7251948 WindowsPhone自定义控件详解(一) - 控件类库分析 上一节主要分析了控件 ...
- Spring配置文件详解 – applicationContext.xml文件路径
Spring配置文件详解 – applicationContext.xml文件路径 Java编程 spring的配置文件applicationContext.xml的默 ...
- .NET DLL 保护措施详解(四)各操作系统运行情况
我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...
- logback -- 配置详解 -- 四 -- <filter>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- pika详解(四) channel 通道
pika详解(四) channel 通道 本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权 channel通道 通道 ...
- View绘制详解(四),谝一谝layout过程
上篇博客我们介绍了View的测量过程,这只是View显示过程的第一步,第二步就是layout了,这个我们一般译作布局,其实就是在View测量完成之后根据View的大小,将其一个一个摆放在ViewGro ...
- 自定义控件详解(二):Path类 相关用法
Path:路径 绘制路径:void drawPath (Path path, Paint paint) Path 可以绘制的路径 一.直线路径 1.基本方法 void moveTo (float st ...
- C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...
随机推荐
- 用redux-thunk异步获取数据
概述 最近学习redux,打算用redux-thunk给todo添加异步获取数据组件.记录下来,供以后开发时参考,相信对其他人也有用. 注意: 在todo下方,我异步获取我的react博客的标题,点击 ...
- ElasticSearch权威指南学习(映射和分析)
概念 映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string, number, booleans, date等).+ 分析(analysis)机制用于进行全文 ...
- MySQL备份---lvm snapshot
正常安装(缺点要锁表) 1, 创建一个LV(逻辑卷) , 把MySQL的数据目录放到这个LV上 /var/lib/mysql 对这个LV做快照, 从快照备份数据 删除快照 非正常安装 1,创建LV 2 ...
- Linux编程 4 (创建文件touch,复制文件cp,tab补全,链接文件ln)
一.创建文件 使用touch 可以创建空文件,例如opt目录下创建test2.txt文件.这种一般是有些程序必须要先创建文件,才能使用. 二. 复制文件 2.1 使用cp命令来复制文件,需要两个参数- ...
- 关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup
http://www.cnblogs.com/binye-typing/p/6656595.html 读者可能会奇怪我标题怎么理成这个鬼样子,主要是单单写 lxml 与 bs4 这两个 py 模块名可 ...
- java——IObufferedReader文件输入输出流
package com.jredu.ch02_lianxi; import java.io.BufferedReader;import java.io.BufferedWriter;import ja ...
- Android生成自定义二维码
前面说过两种二维码扫描方式,现在说如何生成自定义酷炫二维码.二维码生成需要使用Google开源库Zxing,Zxing的项目地址:https://github.com/ZBar/ZBar,我们只需要里 ...
- Android中Enum(枚举)的使用
简介 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.l ...
- postgres 更新数据表
新增非空列: alter table t_test add column user_id integer; update t_test set user_id=0; alter table t_tes ...
- interface21 - web - DispatcherServlet(DispatcherServlet初始化流程)
前言 最近打算花点时间好好看看spring的源码,然而现在Spring的源码经过迭代的版本太多了,比较庞大,看起来比较累,所以准备从最初的版本(interface21)开始入手,仅用于学习,理解其设计 ...