一、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在上面画画
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); /*
* 绘制路径
*/
// 没有做处理,还没有写代码 canvas.drawPath(mPath, mPaint);
}
}

2.2 不设置效果

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

2.3 CornerPathEffect

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

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

2.4 DiscretePathEffect

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

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

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

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

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

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

2.5 DashPathEffect

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

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

    @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 把画布往下移动250
canvas.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)我称之为偏移值,动态改变其值会让路径产生动画的效果。

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

2.6 PathDashPathEffect

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

    @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 把画布往下移动250
canvas.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的setPathEffect(PathEffect effect)、以及Path的具体使用,收益多多!

    Paint的setPathEffect(PathEffect effect).以及Path的具体使用,收益多多! 在这首先申明一下介绍只是为了学习使用 内容都来自:http://www.cnblogs ...

  2. 详解Paint的各种set方法

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

  3. 详解Paint的setXfermode(Xfermode xfermode)

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

  4. 详解Paint的setShader(Shader shader)

    一.概述 setShader(Shader shader)中传入的自然是shader对象了,shader类是Android在图形变换中非常重要的一个类.Shader在三维软件中我们称之为着色器,其作用 ...

  5. 详解Paint的setMaskFilter(MaskFilter maskfilter)

    一.setMaskFilter(MaskFilter maskfilter) setMaskFilter(MaskFilter maskfilter)是paint中的方法,它可以用来对图像进行一定的处 ...

  6. 详解Paint的setColorFilter(ColorFilter filter)

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

  7. android 绘图之Path与Paint详解

    /** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分 ...

  8. 图形绘制 Canvas Paint Path 详解

    图形绘制简介        Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.grap ...

  9. android 开发 View _5_ Paint详解

    转载:http://blog.csdn.net/abcdef314159 //Paint的setStyle,Style共有3种 setStyle(Style style) Paint.Style.FI ...

随机推荐

  1. nginx后的tomcat获取真实用户ip

    目前大部分获取ip的方式:beat.getRequest().getRemoteAddr()但是,如果通过nginx反向代理的话,就获取不到真实ip,是获取的nginx的ip 需要:添加    pro ...

  2. Silver Cow Party(最短路,好题)

    Silver Cow Party Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Su ...

  3. [LeetCode] Pow(x, n) 二分搜索

    Implement pow(x, n). Hide Tags Math Binary Search     题目很简单的.   class Solution { public: double pow( ...

  4. 一种高效的 vector 四则运算处理方法

    实现 vector 的四则运算 这里假设 vector 的运算定义为对操作数 vector 中相同位置的元素进行运算,最后得到一个新的 vector.具体来说就是,假如 vector<int&g ...

  5. MyBatis知多少(22)MyBatis删除操作

    本节从表中使用MyBatis删除记录. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT NOT NULL auto_increment, f ...

  6. Unity 脚本系统

    什么是脚本?脚本是一个 MonoBehavior, 继承关系是 MonoBehavior -> Behavior -> Component -> Object GameObject ...

  7. Android 布局之TableLayout

    Android 布局之TableLayout 1 TableLayout简介 TableLayout是表格布局.TableLayout 可设置的属性包括全局属性及单元格属性. 1.1 全局属性 有以下 ...

  8. Node.js建站笔记-使用react和react-router取代Backbone

    斟酌之后,决定在<嗨猫>项目中引入react,整体项目偏重spa模式,舍弃部分server端的模板渲染,将一部分渲染工作交给前端react实现. react拥有丰富的组件,虽然不如Back ...

  9. 【JVM学习笔记一】JVM内存分布

    Overview 学习JVM首先需要了解一下JVM管理的内存是如何分布的,在看了<深入理解Java虚拟机>和一些博文之后,我准备自己记录一下学习的过程. 下图是JVM中运行时数据区的大致示 ...

  10. c# XML序列化与反序列化

    c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWrite ...