详解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在上面画画
     */
    @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

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

时间: 2024-12-23 14:45:37

详解Paint的setPathEffect(PathEffect effect)的相关文章

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

Paint的setPathEffect(PathEffect effect).以及Path的具体使用,收益多多! 在这首先申明一下介绍只是为了学习使用 内容都来自:http://www.cnblogs.com/tianzhijiexian/p/4297783.html,感谢啦!受益多多! 一.setPathEffect() 这个方法一看就和path有关,顾名思义,它就是给path设置样式(效果)的.PathEffect这个路径效果类没有具体的实现,效果是由它的六个子类实现的: 这六个子类分别可以

详解Paint中的各种set方法

我们用set方法来设置画笔的样式,类似于我们挑选画笔画画的过程. set(Paint src) 顾名思义为当前画笔设置一个画笔,说白了就是把另一个画笔的属性设置Copy给我们的画笔,不累赘了 setAlpha(int a); 设置绘制图形的透明度,设置范围是[0..255] setAntiAlias(boolean aa) 打开抗锯齿.抗锯齿是依赖于算法的,算法决定抗锯齿的效率,在我们绘制棱角分明的图像时,比如一个矩形.一张位图,我们不需要打开抗锯齿. setARGB(int a, int r,

详解Paint的setMaskFilter(MaskFilter maskfilter)

一.setMaskFilter(MaskFilter maskfilter) setMaskFilter(MaskFilter maskfilter)是paint中的方法,它可以用来对图像进行一定的处理.这个方法需要传入一个MaskFilter对象.但MaskFilter类中没有任何实现方法,所以我们就要认识下它的两个子类BlurMaskFilter和EmbossMaskFilter,前者为模糊遮罩滤镜而后者为浮雕遮罩滤镜. 二.BlurMaskFilter 2.1 初识 我们在之前的cardV

详解Paint的setShader(Shader shader)

一.概述 setShader(Shader shader)中传入的自然是shader对象了,shader类是Android在图形变换中非常重要的一个类.Shader在三维软件中我们称之为着色器,其作用是来给图像着色.它有五个子类,像PathEffect一样,它的每个子类都实现了一种Shader.下面来看看文档中的解释: 子类:BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient 二.BitmapSha

详解Paint的setXfermode(Xfermode xfermode)

一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是图像混合的一种,这个方法跟我们上面讲到的setColorFilter蛮相似的.查看API文档发现其果然有三个子类:AvoidXfermode, PixelXorXfermode和PorterDuffXfermode,这三个子类实现的功能要比setColorFilter的三个子类复杂得多. 二.Avo

Android Paint之PathEffect详解

尊重原创,转载请标明出处    http://blog.csdn.net/abcdef314159 在之前讲Android Paint的使用详解的时候,其中有一个方法setPathEffect(PathEffect effect)没有详细介绍,这篇就结合代码来介绍一下,在之前说过PathEffect共有6个子类ComposePathEffect,CornerPathEffect,DashPathEffect,DiscretePathEffect,PathDashPathEffect,SumPat

android Paint 详解

/**     * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关. * * 1.图形绘制 * setARGB(int a,int r,int g,int b); * 设置绘制的颜色,a代表透明度,r,g,b代表颜色值. * * setAlpha(int a); * 设置绘制图形的透明度. * * setCol

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

Paint  画笔 ,即用来绘制图形的"笔" 前面我们知道了Paint的一些基本用法: paint.setAntiAlias(true);//抗锯齿功能 paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth(10);//设置画笔宽度 ,单位px paint.setShadowLayer(10, 15, 15, Color.GREEN);//设置阴影 不过我

Android Paint、Path详解

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