一、setPathEffect()

这个方法一看就和path有关,顾名思义,它就是给path设置样式(效果)的。PathEffect这个路径效果类没有具体的实现,效果是由它的六个子类实现的:

这六个子类分别可以实现不同的路径效果:

下面,我们来用代码来具体实现一下。

二、测试代码

2.1 代码框架

首先初始化paint和path,然后配置相关属性,最后作画。

package com.kale.cview;public class CustomView extends View {// 实例化画笔private Paint mPaint = null;private Path mPath;// 路径对象private Context mContext;public CustomView(Context context) {super(context);}/*** 当你要给view添加attribute的时候就需要用到这个构造* * @param context* @param attrs*/public CustomView(Context context, AttributeSet attrs) {super(context, attrs);mContext = context;// 初始化画笔
        initPaint();initPath();}private void initPaint() {// 实例化画笔并打开抗锯齿// mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint = new Paint();mPaint.setStyle(Paint.Style.STROKE);  mPaint.setStrokeWidth(5);  mPaint.setColor(Color.DKGRAY);  }private void initPath() {// 实例化路径mPath = new Path();// 定义路径的起点mPath.moveTo(10, 50);// 定义路径的各个点for (int i = 0; i <= 30; i++) {mPath.lineTo(i * 35, (float) (Math.random() * 100));}}/** 绘制view时调用的方法,可能会出现多次调用,所以不建议在这里面实例化对象,也就是不要出现new* * @param canvas 一个画布对象,我们可以用paint在上面画画*/@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);/** 绘制路径*/// 没有做处理,还没有写代码canvas.drawPath(mPath, mPaint);}
}

2.2 不设置效果

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 把画布往下移动250canvas.translate(0, 250);  /** 绘制路径*/// 没有做处理,显示生硬mPaint.setPathEffect(null);canvas.drawPath(mPath, mPaint);}

2.3 CornerPathEffect

CornerPathEffect则可以将路径的转角变得圆滑,CornerPathEffect的构造方法只接受一个参数radius,意思就是转角处的圆滑程度。

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 把画布往下移动250canvas.translate(0, 250);  /** 绘制路径*/mPaint.setPathEffect(new CornerPathEffect(50));canvas.drawPath(mPath, mPaint);}

2.4 DiscretePathEffect

DiscretePathEffect(离散路径效果)相对来说则稍微复杂点,其会在路径上绘制很多“杂点”的突出来模拟一种类似生锈铁丝的效果。其构造方法有两个参数:

第一个呢指定这些突出的“杂点”的密度,值越小杂点越密集;

第二个参数呢则是“杂点”突出的大小,值越大突出的距离越大反之反之。

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 把画布往下移动250canvas.translate(0, 250);  /** 绘制路径*/mPaint.setPathEffect(new DiscretePathEffect(3.0F, 5.0F));canvas.drawPath(mPath, mPaint);}

当我们设置杂点密度很大,突出距离较小时,你会发现线条也变得柔和了起来。

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 把画布往下移动250canvas.translate(0, 250);  /** 绘制路径*/mPaint.setPathEffect(new DiscretePathEffect(10.0F, 2.0F));canvas.drawPath(mPath, mPaint);}

2.5 DashPathEffect

它的效果相对与上面两种路径效果来说要略显复杂,其虽说也是包含了两个参数:

第一个参数是一个浮点型的数组,那这个数组有什么意义呢?其实是这样的,我们在定义该参数的时候只要浮点型数组中元素个数大于等于2即可,也就是说上面我们的代码可以写成这样的:

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 把画布往下移动250canvas.translate(0, 250);  /** 绘制路径*/mPaint.setPathEffect(new DashPathEffect(new float[] {20, 10}, 1));canvas.drawPath(mPath, mPaint);}

loat[] {20, 10}的偶数参数20(注意数组下标是从0开始哦)定义了我们第一条实线的长度,而奇数参数10则表示第一条虚线的长度,如果此时数组后面不再有数据则重复第一个数以此往复循环,整条线就成了[20,10,20,10,20,10…………………………]这么一个状态。当然如果你想要对每个实线和虚线进行设置,你可以这样:

mEffects[3] = new DashPathEffect(new float[] {20, 10, 50, 5, 100, 30, 10, 5}, mPhase);  

而DashPathEffect的第二个参数(phase)我称之为偏移值,动态改变其值会让路径产生动画的效果。

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 把画布往下移动250canvas.translate(0, 250);  /** 绘制路径*/mPaint.setPathEffect(new DashPathEffect(new float[] {20, 10}, phase));canvas.drawPath(mPath, mPaint);// 改变偏移值phase++;// 重绘,产生动画效果
        invalidate();}

2.6 PathDashPathEffect

PathDashPathEffect和DashPathEffect是类似的,不同的是PathDashPathEffect可以让我们自己定义路径虚线的样式,比如我们将其换成一个个小圆组成的虚线:

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 把画布往下移动250canvas.translate(0, 250);  /** 绘制路径*/Path path = new Path();  path.addCircle(0, 0, 3, Direction.CCW);  PathEffect pathEffect = new PathDashPathEffect(path, 12, phase, PathDashPathEffect.Style.ROTATE);  mPaint.setPathEffect(pathEffect);canvas.drawPath(mPath, mPaint);// 改变偏移值phase++;// 重绘,产生动画效果
        invalidate();}

2.7 ComposePathEffect和SumPathEffect

ComposePathEffect和SumPathEffect都可以用来组合两种路径效果,就是把两种效果二合一。唯一不同的是组合的方式:

ComposePathEffect(PathEffect outerpe, PathEffect innerpe)会先将路径变成innerpe的效果,再去复合outerpe的路径效果,即:outerpe(innerpe(Path));

SumPathEffect(PathEffect first, PathEffect second)则会把两种路径效果加起来再作用于路径。

本文大部分内容来自:http://blog.csdn.net/aigestudio/article/details/41447349

本人对于原文做了删减和整理,代码均自己敲过。记录在此,仅作学习笔记之用。

From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige  尊重原作者,感谢作者的分享!

详解Paint的setPathEffect(PathEffect effect)相关推荐

  1. 详解Paint的各种set方法

    一.前言 我们用set方法来设置画笔的样式,类似于我们挑选画笔画画的过程.由于上面有些方法不支持硬件加速,所以在高版本系统中可能会没有效果.因此,我们首先来看看官方废弃的方法. 当你要使用打叉的方法时 ...

  2. java setpaintmode 用法_详解Paint的各种set方法

    (1) 在application配置文件中关闭硬件加速: android:allowBackup="true"android:hardwareAccelerated="f ...

  3. 三个绘图工具类详解Paint(画笔)Canvas(画布)Path(路径)

    1)Paint(画笔): 就是画笔,用于设置绘制风格,如:线宽(笔触粗细),颜色,透明度和填充风格等 直接使用无参构造方法 就可以创建Paint实例: Paint paint = new Paint( ...

  4. 详解Paint的setXfermode(Xfermode xfermode)

    一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的"过渡 ...

  5. 详解Paint的setColorFilter(ColorFilter filter)

    一.简介 setColorFilter(ColorFilter filter) 设置颜色过滤,这个方法需要我们传入一个ColorFilter参数同样也会返回一个ColorFilter实例.我们在set ...

  6. Android Paint set方法详解

    一.前言 我们用set方法来设置画笔的样式,类似于我们挑选画笔画画的过程.由于上面有些方法不支持硬件加速,所以在高版本系统中可能会没有效果.因此,我们首先来看看官方废弃的方法. 下图来自: https ...

  7. Canvas(画布)、Paint(画笔) 详解

    一.自定义控件分类: 1.组合控件:将系统原生控件组合起来,加上动画效果,形成一种特殊的UI效果 2.纯粹自定义控件:继承自系统的View,自己去实现view效果 二.Canvas(画布).Paint ...

  8. Android Paint、Path详解

    都是自己随手练习时写的一些小demo Paint类: package com.gyz;import android.content.Context; import android.graphics.B ...

  9. 自定义控件详解(四):Paint 画笔路径效果

    Paint  画笔 ,即用来绘制图形的"笔" 前面我们知道了Paint的一些基本用法: paint.setAntiAlias(true);//抗锯齿功能 paint.setColo ...

最新文章

  1. 比特币黄金(BTG)遭受51%双花攻击?——不亏
  2. 我的WCF之旅 (11): 再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯...
  3. linux运行容器,容器与云|如何在 Windows 上运行 Linux 容器
  4. onedrive下载
  5. Hadoop示例程序手动编译
  6. matlab读取/播放视频的函数(1)
  7. 安装CentOS 7 遇到的坑
  8. MVC5+EF6 入门完整教程四
  9. 深度学习TF—3.神经网络全连接层
  10. vuex使用及自定义Vue指令vue-permission
  11. TP-Link TD-W89841N 增强型无线路由器快速设置指南
  12. 总结了200道经典的机器学习面试题(附参考答案)
  13. 云服务器搭建个人博客
  14. Task07: 凸优化;梯度下降;优化算法进阶 学习笔记
  15. Git Git用户ssh公钥管理
  16. 造梦师的梦想是什么样的?
  17. 01 - 汽车功能安全(ISO 26262)系列 - 开篇
  18. cogs 1487. 麻球繁衍(概率dp)
  19. GBase 8a 支持存储过程、自定义函数的定义和使用
  20. 灵隐寺招聘:没有KPI,佛系上班……

热门文章

  1. linux mysql添加用户名和密码错误,linux下为mysql设置用户名和密码
  2. 电脑画画软件_手绘、板绘、还有用pad画画都有啥区别?
  3. Java学习总结:56(Stack子类)
  4. ssm框架mysql配置_ssm框架使用详解配置两个数据源
  5. Java项目:房屋租赁管理系统(java+SSM+Layui+Maven+Mysql+Jsp)
  6. 样式集(10) - 滑动删除功能实现,VUE完整源码附效果图
  7. 阿里云https证书apache配置
  8. 微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)
  9. 2-RACommand
  10. 02-dispatch_barrier