Paint的setPathEffect(PathEffect effect)、以及Path的具体使用,收益多多!

在这首先申明一下介绍只是为了学习使用

内容都来自:http://www.cnblogs.com/tianzhijiexian/p/4297783.html,感谢啦!受益多多!

一、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)则会把两种路径效果加起来再作用于路径。

这对自定义控件帮助更大,一般都会在自定义控件中使用,我自己也学到了,希望可以帮助其他的人了

Paint的setPathEffect(PathEffect effect)、以及Path的具体使用,收益多多!的更多相关文章

  1. 详解Paint的setPathEffect(PathEffect effect)

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

  2. 详解Paint的各种set方法

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

  3. Android_(控件)使用自定义控件在屏幕中绘制一条虚线

    在Android屏幕中绘制虚线,最通用的是自定义控件DashedLine,再将自定义控件放入xml布局中 运行截图: 程序结构 package com.example.asus.gary_042; i ...

  4. 从0开始学自定义View -1

    PS:好久没有写博客了,之前的东西有所忘记,百度一下竟然查到了自己的写过的博客,访问量还可以,一开始的写博客的初衷是把自己不会的记录下来,现在没想到也有博友会关注我,这就给了我动力,工作之余把零零碎碎 ...

  5. android 绘图之Path与Paint详解

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

  6. 图形绘制 Canvas Paint Path 详解

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

  7. Android Paint的属性

    在Paint中有很多的属性可以设置,比如可以设置阴影,颜色过滤等等,这些会产生不同的奇妙效果,今天就对各种属性探索一下. 方法一: 1 //设置绘制的颜色,a代表透明度,r,g,b代表颜色值. 2 s ...

  8. 【转】(转)【Android】Paint的效果研究

    转自:http://wpf814533631.iteye.com/blog/1847661 (转)[Android]Paint的效果研究 博客分类: android   在Paint中有很多的属性可以 ...

  9. 自定义View(5)Paint常用的一些绘制滤镜,特效等介绍

    Shader 返回绘图过程中重复色块的基类 相关方法:Paint::setShader(Shader shader) BitmapShader 从位图加载重复色块 LinearGradient, Ra ...

随机推荐

  1. Javascript 内置值、typeof运算符、true/false判断

    一.内置值       true       false         null         undefined       NaN       Infinity   二.typeof运算结果 ...

  2. Linux用ps命令查找进程PID再用kill命令终止进程的方法

    使用linux操作系统,难免遇到一些软件"卡壳"的问题,这时就需要使用linux下强大的kill命令来结束相关进程.这在linux系统下是极其容易的事情,你只需要kill xxx即 ...

  3. BindVertexbuffer

    stride 的意思是 inputstream.layout 的大小 比如 description是 pos uv normal stride 就是一组pos uv normal的大小 ns  里面 ...

  4. BindDepthStencilState

    nx sdk里面有这么一个接口 真坑 对于stencil fun op有两组值分别对应front back face 现在调用这个接口只能设置back 不能设置front跟了memory 有段全是0把 ...

  5. WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试) 接口测试与数据驱动

    转载:http://www.cnblogs.com/chengtch/p/6576117.html 1简介 数据驱动测试,即是分离测试逻辑与测试数据,通过如excel表格的形式来保存测试数据,用测试脚 ...

  6. C++11之右值引用(三):使用C++11编写string类以及“异常安全”的=运算符

    前面两节,说明了右值引用和它的作用.下面通过一个string类的编写,来说明右值引用的使用. 相对于C++98,主要是多了移动构造函数和移动赋值运算符. 先给出一个简要的声明: class Strin ...

  7. Recycling Settings for an Application Pool <recycling>

    Overview The <recycling> element contains configuration settings that control the conditions t ...

  8. mysql 修复

    /home/wkubuntu/mysql/data/iZ25sgya7raZbak.pid  pid 文件notfond 错误解决 一.截图 snipingtool skip-locking 修改成 ...

  9. jQuery异步框架探究2:jQuery.Deferred方法

    (本文针对jQuery1.6.1版本号)关于Deferred函数的描写叙述中有一个词是fledged,意为"羽翼丰满的",说明jQuery.Deferred函数应用应该更成熟. 这 ...

  10. mybatis 遇到的问题

    顺序问题:在resultmap中,result必须在association之前.否则会报错 只查出一条记录的问题  :重名的id,要起别名.而且不能忽略. mybaits错误解决:There is n ...