Paint的setPathEffect(PathEffect effect)、以及Path的具体使用,收益多多!
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的具体使用,收益多多!的更多相关文章
- 详解Paint的setPathEffect(PathEffect effect)
一.setPathEffect() 这个方法一看就和path有关,顾名思义,它就是给path设置样式(效果)的.PathEffect这个路径效果类没有具体的实现,效果是由它的六个子类实现的: 这六个子 ...
- 详解Paint的各种set方法
一.前言 我们用set方法来设置画笔的样式,类似于我们挑选画笔画画的过程.由于上面有些方法不支持硬件加速,所以在高版本系统中可能会没有效果.因此,我们首先来看看官方废弃的方法. 下图来自:https: ...
- Android_(控件)使用自定义控件在屏幕中绘制一条虚线
在Android屏幕中绘制虚线,最通用的是自定义控件DashedLine,再将自定义控件放入xml布局中 运行截图: 程序结构 package com.example.asus.gary_042; i ...
- 从0开始学自定义View -1
PS:好久没有写博客了,之前的东西有所忘记,百度一下竟然查到了自己的写过的博客,访问量还可以,一开始的写博客的初衷是把自己不会的记录下来,现在没想到也有博友会关注我,这就给了我动力,工作之余把零零碎碎 ...
- android 绘图之Path与Paint详解
/** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分 ...
- 图形绘制 Canvas Paint Path 详解
图形绘制简介 Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.grap ...
- Android Paint的属性
在Paint中有很多的属性可以设置,比如可以设置阴影,颜色过滤等等,这些会产生不同的奇妙效果,今天就对各种属性探索一下. 方法一: 1 //设置绘制的颜色,a代表透明度,r,g,b代表颜色值. 2 s ...
- 【转】(转)【Android】Paint的效果研究
转自:http://wpf814533631.iteye.com/blog/1847661 (转)[Android]Paint的效果研究 博客分类: android 在Paint中有很多的属性可以 ...
- 自定义View(5)Paint常用的一些绘制滤镜,特效等介绍
Shader 返回绘图过程中重复色块的基类 相关方法:Paint::setShader(Shader shader) BitmapShader 从位图加载重复色块 LinearGradient, Ra ...
随机推荐
- nginx的301与302如何配置
转自:http://blog.sina.com.cn/s/blog_5d73ba76010145rr.html 首先看一个完整代码示例,关于nginx 301 302跳转的. 301跳转设置: ser ...
- json格式在线解析
地址:https://www.bejson.com/ { "PN": "123456", "DomainName": ".gxyc ...
- Unity里面的自动寻路(二)
接着我的 上一篇自动寻路文章,这一次我们就来学习一下与自动寻路有关的组件吧.Unity中与自动寻路相关的组件主要有两个:NavMeshAgent ( 又称导航网格代理 ),Off Mesh Link ...
- 字典树-HDOJ-1247-Hat’s Words
Hat's Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- Nginx:管理HTTP模块的配置项
参考资料<深入理解Nginx> 一个nginx.conf的例子 http { mytest_num ; server { server_name A; listen ; mytest_nu ...
- 将apache添加到服务
拿apache为例 1.将应用程序放在PATH的任一个目录下,一般放在/usr/sbin/.执行下面命令 cp /usr/local/apache2/bin/httpd /usr/sbin/httpd ...
- Redis与Reactor模式
Redis与Reactor模式 Jan 9, 2016 近期看了Redis的设计与实现,这本书写的还不错,看完后对Redis的理解有非常大的帮助. 另外,作者整理了一份Redis源代码凝视,大家能够c ...
- 【hadoop之翊】——windows 7使用eclipse下hadoop应用开发环境搭建
由于一些缘故,这节内容到如今才写.事实上弄hadoop有一段时间了,能够编写一些小程序了,今天来还是来说说环境的搭建.... 说明一下:这篇文章的步骤是接上一篇的hadoop文章的:http://bl ...
- python常见面试题(一)
1.Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都 ...
- 【cocos2dx开发技巧10】cocosStudio的集成以及c++11的新特性
转发.请保持地址:http://blog.csdn.net/stalendp/article/details/38880997 非常长时间没有碰cocos2dx了,近期又用起来了.花了好几个小时又一次 ...