自定义控件详解(四):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 ...
随机推荐
- HoloLens开发手记-开发概述Development overview
开发HoloLens全息应用将使用UWP平台(Universal Windows Platform),所有的HoloLens应用都是Win10通用应用,所有UWP通用应用都可以在HoloLens上运行 ...
- 脚手架vue-cli系列五:基于Nightwatch的端到端测试环境
不同公司和组织之间的测试效率迥异.在这个富交互和响应式处理随处可见的时代,很多组织都使用敏捷的方式来开发应用,因此测试自动化也成为软件项目的必备部分.测试自动化意味着使用软件工具来反复运行项目中的测试 ...
- python之内置装饰器(property/staticmethod/classmethod)
python内置了property.staticmethod.classmethod三个装饰器,有时候我们也会用到,这里简单说明下 1.property 作用:顾名思义把函数装饰成属性 一般我们调用类 ...
- [每天解决一问题系列 - 0013] 如何修改WiX Burn内置的窗口
问题描述: 我们产品的burn安装包仅支持.net 3.5 sp1以上,在只有.net 2.0的机器上会给用户弹一个窗口,告诉用户为什么不能够安装的原因.本来burn已经内置了,但是在日文操作系统下, ...
- SOA总结(脑图图片)
- 关于requests的session方法保持cookie的问题。
最近在做爬虫的时候遇到了一个问题,在用requests的session方法保持cookie的时候发现requests不能保持手动构建的cookie.起初以为requests只能自动保持由服务器返回的s ...
- 前端进击的巨人(五):学会函数柯里化(curry)
柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...
- OS开发(2):自定义tabbar | 导航条 | 突显中间按钮
tabbar是放在APP底部的控件,也叫navigationbar或导航条.常见的APP都使用tabbar来进行功能分类的管理,比如微信.QQ等等. 需求是这样的,需要一个特殊一点的tabbar,要求 ...
- iOS ipa包瘦身,iOS8及以下text段超60MB
前沿 很早之前写过一篇相关文章,不过博客主机上跑路了之后数据没了,凭着记忆补了下相关资料 ipa安装包瘦身 清理无用图片,图片压缩(PNG换WebP和JPG),处于某种不可抗拒的原因,导致有部分3X图 ...
- Asp.net webform scaffolding结合Generic Unit of Work & (Extensible) Repositories Framework代码生成向导
Asp.net webform scaffolding结合Generic Unit of Work & (Extensible) Repositories Framework代码生成向导 在上 ...