玩过自定义View的小伙伴都知道,在View的绘制过程中,有一个类叫做Path,Path可以帮助我们实现很多自定义形状的View,特别是配合xfermode属性来使用的时候。OK,那我们今天就来看看Path中那几个常用的API。

1.moveTo

moveTo表示将绘制点移动到某一个坐标处,该方法并不会进行绘制,主要是用来移动画笔。默认情况下起始坐标位于(0,0)点,我们可以手动调整默认位置。

2.lineTo

lineTo表示绘制一条直线,参数表示目标坐标如下:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Path path = new Path();
        path.lineTo(getResources().getDimensionPixelSize(R.dimen.dot1x),
                getResources().getDimensionPixelSize(R.dimen.dot1x));
        canvas.drawPath(path, paint);
    }

显示效果如下:

默认情况下,起始点为(0,0)点,如果我用moveTo将起始点坐标移至(0,150),代码如下:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Path path = new Path();
        path.moveTo(0,getResources().getDimensionPixelSize(R.dimen.dot1x));
        path.lineTo(getResources().getDimensionPixelSize(R.dimen.dot1x),
                getResources().getDimensionPixelSize(R.dimen.dot1x));
        canvas.drawPath(path, paint);
    }


3.quadTo

quadTo可以用来绘制一个带控制点的曲线,说白了,其实就是贝塞尔曲线。如下:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Path path = new Path();
        path.moveTo(0, 300);
        path.quadTo(150, 0, 300, 300);
        canvas.drawPath(path, paint);
    }

前两个参数表示控制点的坐标,后两个参数表示结束点的坐标:

4.cubicTo

cubicTo可以用来绘制具有两个控制点的贝塞尔曲线,代码如下:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Path path = new Path();
        path.moveTo(300, 0);
        path.cubicTo(0, 150, 300, 450, 0, 600);
        canvas.drawPath(path, paint);
    }

前两个参数表示第一个控制点的坐标,第三四个参数表示第二个控制点的坐标,第五六个参数表示最终的坐标点,显示效果如下:

5.arcTo

artTo用来绘制一段圆弧,实际上是截取圆或者椭圆的一部分,比如下面一段代码:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Path path = new Path();
        RectF oval = new RectF(0, 0, 300, 300);
        path.arcTo(oval, 0, 90);
        canvas.drawPath(path, paint);
    }

显示效果如下:

该方法接收三个参数,第一个表示弧形所在的矩形,如果矩形为正方形,则画出的弧形为圆的一部分,如果矩形宽高不等,画出的弧形为椭圆的一部分,第二个参数表示绘制的起点位置,0度为钟表三点位置,第三个参数表示绘制的度数。看下面一段代码:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Path path = new Path();
        RectF oval = new RectF(0, 0, 600, 300);
        path.arcTo(oval, 0, 90);
        canvas.drawPath(path, paint);
    }

显示效果如下:

如上则是椭圆的一部分。

arcTo方法还有一个重载的方法,即接收四个参数,最后一个参数表示是否将弧形的起点与上一个图形的终点连接起来,true表示不连接,false表示连接,默认为false,如下一段代码:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Path path = new Path();
        RectF oval = new RectF(0, 0, 600, 300);
        path.arcTo(oval, 0, 90);
        RectF oval2 = new RectF(0, 400, 300, 700);
        path.arcTo(oval2, 90, 180);
        canvas.drawPath(path, paint);
    }

显示效果如下:

如果我给第二条线再添加一个参数true,如下:

    @Override
    protected void onDraw(Canvas canvas) {
        Path path = new Path();
        path.lineTo(150, 150);
        RectF oval2 = new RectF(0, 200, 300, 500);
        path.arcTo(oval2, 0, 180, true);
        canvas.drawPath(path, paint);
    }

显示效果如下:

这里有个坑,一定要运行起来才有效果,编译之后预览看到的效果是错的。囧了个囧。。。。。

6.addArc、addRoundRect、addOval、addRect、addCircle

addArc,添加一个圆弧到路径中,这个圆弧实为圆或者椭圆的一部分,如下一段代码:

    @Override
    protected void onDraw(Canvas canvas) {
        Path path = new Path();
        RectF oval = new RectF(0, 200, 300, 500);
        path.addArc(oval, 0, 180);
        canvas.drawPath(path, paint);
    }

效果如下:

后面几种效果我一起来展示,代码如下:

    @Override
    protected void onDraw(Canvas canvas) {
        Path path = new Path();
        RectF oval = new RectF(50, 50, 150, 150);
        path.addRoundRect(oval,25,25, Path.Direction.CCW);
        RectF oval2 = new RectF(50, 200, 250, 300);
        path.addOval(oval2, Path.Direction.CCW);
        RectF oval3 = new RectF(50, 350, 150, 450);
        path.addRect(oval3, Path.Direction.CCW);
        path.addCircle(100, 550, 50, Path.Direction.CCW);
        canvas.drawPath(path, paint);
    }

显示效果如下:

Direction参数表示方向,其中CW代表顺时针,CCW代表逆时针。

7.Path.Op

Path中还有一个好用的Op属性,这个属性有点类似于Paint中的xfermode属性,可以用来组合两个Path。用法有如下几种:

7.1Path.Op.DIFFERENCE

Path.Op.DIFFERENCE表示从path中去除path2的部分,保留path的部分。如下案例:

    @Override
    protected void onDraw(Canvas canvas) {
        Path path = new Path();
        Path path2 = new Path();
        path.addCircle(200, 200, 100, Path.Direction.CCW);
        path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
        path.op(path2, Path.Op.DIFFERENCE);
        canvas.drawPath(path, paint);
    }

显示效果如下:

7.2Path.Op.INTERSECT

Path.Op.INTERSECT表示取path和path2相交的部分显示出来,如下:

    @Override
    protected void onDraw(Canvas canvas) {
        Path path = new Path();
        Path path2 = new Path();
        path.addCircle(200, 200, 100, Path.Direction.CCW);
        path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
        path.op(path2, Path.Op.INTERSECT);
        canvas.drawPath(path, paint);
    }

显示效果如下:

7.3Path.Op.REVERSE_DIFFERENCE

Path.Op.REVERSE_DIFFERENCE表示除去path的部分,只显示path2的部分,如下:

    @Override
    protected void onDraw(Canvas canvas) {
        Path path = new Path();
        Path path2 = new Path();
        path.addCircle(200, 200, 100, Path.Direction.CCW);
        path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
        path.op(path2, Path.Op.REVERSE_DIFFERENCE);
        canvas.drawPath(path, paint);
    }

显示效果如下:

7.4Path.Op.UNION

Path.Op.UNION表示path和path2的部分都要显示出来,如下:

    @Override
    protected void onDraw(Canvas canvas) {
        Path path = new Path();
        Path path2 = new Path();
        path.addCircle(200, 200, 100, Path.Direction.CCW);
        path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
        path.op(path2, Path.Op.UNION);
        canvas.drawPath(path, paint);
    }

显示效果如下:

7.5Path.Op.XOR

Path.Op.XOR表示显示path和path2但是不包含二者的交集。如下:

    @Override
    protected void onDraw(Canvas canvas) {
        Path path = new Path();
        Path path2 = new Path();
        path.addCircle(200, 200, 100, Path.Direction.CCW);
        path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
        path.op(path2, Path.Op.XOR);
        canvas.drawPath(path, paint);
    }

显示效果如下:

OK,以上就是对Path类的一个简单介绍。

以上。

Android开发之Path类使用详解,自绘各种各样的图形!的更多相关文章

  1. android 绘图之Path与Paint详解

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

  2. iOS开发之UITextField的使用详解

    UITextField的使用详解 UITextField控件是开发中,使用频率比较高的控件了,那么有必要总结一下. 一.UITextField手动编写控件 UITextField  *txtAccou ...

  3. Android开发之MediaRecorder类详解

    MediaRecorder类介绍: MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频,摄像头采集图片信息. MediaRecorder主要函 ...

  4. [置顶] Android开发之Thread类分析

    在我们Linux系统中创建线程函数为:pthread_create(),在Android中我们为线程封装了一个类Thread,实际调用的还是pthread_create() 当我们想创建线程的时候,只 ...

  5. JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)

    HttpServletResponse简介 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 request和re ...

  6. Android开发之Thread类分析 (转载)

    转自:http://blog.csdn.net/llping2011/article/details/9706599 在我们Linux系统中创建线程函数为:pthread_create(),在Andr ...

  7. Android开发之MediaPlayer类

    官网关于MediaPlayer类的使用简介:

  8. Android开发之PackageManager类

    PackageManger,可以获取到手机上所有的App,并可以获取到每个App中清单文件的所有内容. 设置应用程序版本号在应用程序的manifest文件中定义应用程序版本信息.2个必须同时定义的属性 ...

  9. NDK开发之Application.mk文件详解

    做过NDK开发的同学应该都知道有个Application.mk文件,这是android NDK构建系统使用的一个可选构建文件.它的目的是描述应用程序需要哪些模块,也定义了所有模块的一些通用变量.主要有 ...

随机推荐

  1. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析

    如何创建工程 下载最新的Unity发布插件包. 打开Unity,新建一个项目 将插件包导入 在菜单中点击ASRuntime/Create ActionScript3 FlashDevelop HotF ...

  2. [LeetCode] Split Linked List in Parts 拆分链表成部分

    Given a (singly) linked list with head node root, write a function to split the linked list into k c ...

  3. Mysql数据库事务隔离级别

    事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列.事务ACID属性,即原子性(Atomicity).一致性(Consistency ...

  4. 用C# (.NET Core) 实现迭代器设计模式

    本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设 ...

  5. [JSOI2007]麻将

    Description 麻将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西.北.中.发.白七种)和序数 牌(分为条子.饼子.万子三种花色,每种花色各有一到九的九种牌),每种牌各四张. ...

  6. [NOI2005]寿司晚宴

    题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴.小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿司,编号1,2,3,⋯,n-1 ...

  7. 【GDOI】【图论-最短路】时间与空间之旅

    最近打的一场校内训练的某题原题... 题目如下: Description 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spa ...

  8. [UOJ UNR#1]奇怪的线段树

    来自FallDream的博客,未经允许,请勿转载, 谢谢. 原题可以到UOJ看,传送门 如果存在一个点是白的,却有儿子是黑的,显然无解. 不然的话,只要所有黑色的“黑叶子”节点,即没有黑色的儿子的节点 ...

  9. 【Codeforces Round #431 (Div. 1) D.Shake It!】

    ·最小割和组合数放在了一起,产生了这道题目. 英文题,述大意:     一张初始化为仅有一个起点0,一个终点1和一条边的图.输入n,m表示n次操作(1<=n,m<=50),每次操作是任选一 ...

  10. C++函数的重载

    两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参与形参的类型以及个数的最佳匹配,自动确定调用的函数,这就是函数的重载. 两个名字相同的函数必须具有不同的形参,这里的不同指的 ...