当前位置: 首页 > 编程日记 > 正文

详解Paint的setPathEffect(PathEffect effect)

一、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  尊重原作者,感谢作者的分享!

相关文章:

返回手势导致页面卡死并且UI错乱的问题解决

问题记录:在做了部分页面的转场动画之后,返回手势不灵了,快速连续返回的话会卡住,App退到后台再重新激活之后页面不卡了,但是UI错乱. 解决方案: 1. 在UINavigationController子类实现代理UIGestureRecognizerDelegate,并在viewDidLoad方法中增加代理设置: - (void)viewDidLoad …

Spring学习笔记:3(面向切面AOP)

AOP&#xff1a;Aspect Oriented Program&#xff08;面向切面&#xff09; 我们再回顾一下AOP的一些术语&#xff1a; 通知&#xff08;Advice&#xff09; 就是你想要的功能&#xff0c;也就是的安全、事物、日志等。先定义好&#xff0c;然后在想用的地方用一下。 连接…

Blender全流程制作真实感3D产品学习教程

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:41节课(4h 29m) |大小解压后:4.53 GB 仅使用blender 2.8进行建模、纹理、光照和渲染&#xff0c;…

如何给iOS应用添加原生的二维码扫描功能

之前总觉得二维码扫描很高大上&#xff0c;其实apple工程师早就为我们提供了便捷的方法。二维码扫描第三方的库也挺多的&#xff0c;不过效率高的当属系统提供的扫描方法。 二维码扫描主要用到了以下几个类&#xff1a;AVCaptureDevice,AVCaptureDeviceInput,AVCaptureMetadata…

2021-2027年中国市医疗电子场投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国医疗电子行业市场行业相关概述、中国医疗电子行业市场行业运行环境、分析了中国医疗电子行…

RabbitMQ入门(4)--路由

2019独角兽企业重金招聘Python工程师标准>>> ###路由 ###&#xff08;使用Java客户端&#xff09; 在先前的指南中&#xff0c;我们建立了一个简单的日志系统。我们可以将我们的日志信息广播到多个接收者。 在这部分的指南中&#xff0c;我们将要往其中添加一个功能…

从一个数组中寻找出现奇数次的数字

假设给定了数组nums为[0,1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,1,2,3,3,0] 其中3出现了3次 而其他数字都出现了两次 则我们应该得到结果为3 第一种方式&#xff1a;使用Hash 1 /**2 * 使用hash3 * */4 public static int singleNumber_1(int[] nums) {5 …

Blender写实建筑场景制作学习教程 Exterior Visualization in Blender 2.9

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:26节课(3h 41m) |大小:3.3 GB 使用Blender创建惊人的外部渲染。 你会学到: Blender中的建模、着色…

Postman增删改查接口测试

查 一.选择Get方式 二.点击Send开始测试&#xff0c;得出结果 增 一.选择Post方式 二.输入需要增添的数据 三.点击Send测试 四.没有报错&#xff0c;添加成功 查看一下&#xff0c;发现确实添加进去了 删 一.选择Delete方式 二.根据id删除&#xff0c;在请求路径下直接写出…

新安装Ubuntu加载时提示“为/检查磁盘时发生严重错误”的解决方法

本文部分内容转载自&#xff1a; http://jingyan.baidu.com/article/0aa22375bbffbe88cc0d6419.html http://www.aichengxu.com/view/35086 解决方法&#xff1a; 1. 进入Ubuntu启动菜单时按e 键进入启动项编辑模式&#xff1a; 2. 找到代码【ro rootflagsync】&#xff0c;将其…

android binder机制之——(创建binder服务)

Binder机制编程前面的几篇文章具体介绍了android中binder机制的方方面面&#xff0c;相信你对binder机制已经有了较深刻的理解。俗话说得好“学以致用”&#xff0c;以下我们就通过在android系统中创建一个我们自己的binder服务&#xff0c;来加深对binder机制的理解。&#xf…

通过NSProxy来解决NSTimer使用不当造成内存泄漏的问题

NSTimer的一般使用: 1 interface ViewController : UIViewController2 property (nonatomic, strong) NSTimer *timer;3 end4 5 implementation ViewController6 - (void)viewDidLoad {7 [super viewDidLoad];8 [self startTimer];9 } 10 11 - (void)startTimer { 12 …

Blender 2.9中的真实感三维产品全流程制作学习教程

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:41节课(6h 23m) |大小:5.83 GB 含课程文件 使用blender 2.9建模、纹理、光照和渲染真实的吉他 …

SpringBoot中的SFL4J日志

SpringBoot&#xff1a;底层是Spring框架&#xff0c;Spring框架默认使用的是JCL日志的抽象层 SpringBoot选用SLF4J和logback 如何系统地在系统中使用SLF4J 在开发的使用&#xff0c;日志记录方法的调用&#xff0c;不应该来直接调用日志的实现类&#xff0c;而是调用日志抽象…

web开发性能优化---用户体验篇

怎样从技术角度怎样增强用户体验。都是非常多平台都在做的事情&#xff0c;依据个人实际经验碰到几种体验做下总结。1、降低页面刷新白屏适当使用ajax技术。改善刷新白屏现象。2、信息提醒&#xff0c;邮件、站内信、短信在购物流程、售后流程适当添加信息温馨提醒环节&#xf…

linux命令2--cd和pwd

2019独角兽企业重金招聘Python工程师标准>>> cd是linux中最为常见的一个命令&#xff0c;其作用就是切换到某一个路径下 例子1 到自己的用户目录下 cd ~ 也可以直接cd 例子2 返回进入当前目录之前的目录 cd - 例子3 把上一个命令作为cd的参数命令 cd !$ 参考文档&am…

COALESCE语句解救sql的sum问题

mysqlmybatis有一个sql语句是统计用的 <select id"getNum" resultType"map"> 结果是一个map&#xff0c; select语句的结果是一些sum select sum(t.anum),sum(t.bnum)from tableSum twhere t.id #{id} 调试发现&#xff0c;数据库明明记录已经落入&…

在UE5创造一个多山的松树森林场景学习教程

UE5游戏场景设计制作视频教程 大小解压后&#xff1a;4.37G 1920X1080 mp4 语言&#xff1a;英语中英字幕&#xff08;机译&#xff09;时长&#xff1a;5小时 20分 课程获取&#xff1a;在UE5创造一个多山的松树森林场景学习教程

编写纳新网站后端的相关知识总结

使用HSSFWorkbook导出数据库中的数据 导入Apache POI Maven jar包 <!-- Apache POI --> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.6</version> </dependency>在控制层编…

IOSUIcontrol事件

UIKit提供了一组控件&#xff1a;UISwitch开关、UIButton按钮、UISegmentedControl分段控件、UISlider滑块、UITextField文本字段控件、UIPageControl分页控件。 控件是对UIView派生类的实用增强及补充&#xff0c;并可以直接附着于导航栏、表格单元&#xff0c;甚至更大的对象…

Xcode Debugging

程序员日常开发中有大量时间都会花费在 debug 上&#xff0c;从事 iOS 开发不可避免地需要使用 Xcode。这篇博客就主要介绍了 Xcode 中几种能够大幅提升代码调试效率的方式。“If debugging is the process of removing bugs, then programming must be the process of putting…

css小技巧 -- 单标签实现单行文字居中,多行文字居左

可能出现的尺寸场景: 代码如下&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&q…

Unity游戏开发大师班

大小解压后&#xff1a;8.63G 持续时间19h 包含项目文件 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; Unity游戏开发大师班 信息: 要求 –没有课程要求&#xff0c;展示了开发过程的每一步(包括解释的每一行代码) 这门课…

GC处理的分析

GC处理的深入分析 在Java中针对垃圾收集也提供了多种不同的处理分类 1.引用计数&#xff1a; 一个实例化对象&#xff0c;如果有程序使用了这个引用对象&#xff0c;引用计数加一&#xff0c;当一个对象使用完毕&#xff0c;引用计数减一&#xff0c;当引用计数为0时&#x…

2016.1.20 dubbo启动之后机器ip有问题

环境 100.0.4.222 zookerper 2182 100.0.4.221 dubbo 20871 1.问题 dubbo 对应的机器ip 是202.106.199.37 不是100.0.4.221 2.解决 说明 主机名有问题 修改主机名 使之生效 重启zookeeper服务 和dubbo服务 搞定 转载于:https://www.cnblogs.com/huawei306/p…

在Eclipse或MyEclipse中安装findbugs插件

2019独角兽企业重金招聘Python工程师标准>>> 我们都知道&#xff0c;在Eclipse或MyEclipse中安装插件有两种方式&#xff0c;一种是在线安装&#xff0c;第二种是先下载插件然后在本地安装。 在这里我们先介绍第一种在线安装。 Eclipse上在线安装findbugs(具体步骤如…

Jboss解决只能通过localhost访问而不能使用IP访问项目的问题

jboss的配置文件&#xff0c;如 E:\downloadChrome\wildfly-10.1.0.Final\standalone\configuration\shandalone.xml <interfaces> <interface name"management"> <inet-address value"${jboss.bind.address.management:127.0.0.1}"/>…

一.JDBC概述

第1章&#xff1a;JDBC概述 1.1 数据的持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大…

在Blender中创建惊人的低多边形动画

大小解压后&#xff1a;13.5G 持续时间10小时 包括项目文件 1920X1080 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 标题:CGBoost学院–立方体世界在Blender中创建惊人的低多边形动画 信息: 创建漂亮的3D动画&#xff0c;就像玩乐高…

开发Eclipse自定义控件

摘自&#xff1a;http://www.ibm.com/developerworks/cn/opensource/os-eclipcntl/ 我们在开发自定义控件时主要考虑以下问题&#xff1a; 1、 自定义控件的绘制&#xff1a;通常我们需要自己对控件的形状或图案进行绘制&#xff1b; 2、 控件对键盘事件的响应&#xff1a;当焦…