Path相关评论的方法(一)

Path相关评论的方法(一)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

以前的主要是关于Canvas的translate(平移) 、scale(缩放) 、rotate(旋转) 、skew(错切)。接下来几篇主要讲下android里的Path(封装了贝塞尔曲线)& Canvas里的drawPath(path,paint);

非常多人听到贝塞尔曲线,就认为似乎挺高端大气上档次。后面会和大家一起揭开它的面纱,一睹真容;

Path(路径):

我们先看看Path类里有哪些方法

Path相关评论的方法(一)

Path相关评论的方法(一)

咱们从上往下看:

构造函数有两个。各自是

    /**
     * Create an empty path
     */
    public Path() {
        mNativePath = init1();
        mDetectSimplePaths = HardwareRenderer.isAvailable();
    }

    /**
     * Create a new path, copying the contents from the src path.
     *
     * @param src The path to copy from when initializing the new path
     */
    public Path(Path src) {
        int valNative = 0;
        if (src != null) {
            valNative = src.mNativePath;
        }
        mNativePath = init2(valNative);
        mDetectSimplePaths = HardwareRenderer.isAvailable();
    }


这没啥好说的,另外一种就是直接复用src 里设置的属性创建一个新的Path对象。

path.reset():清除掉path里的线条和曲线,可是不会改变它的fill-type(后面setFillType再说);

path.rewind():清除掉path里的线条和曲线,可是会保留内部的数据结构以便重用;

path.set(Path src);用src的内容替换原path的内容,一起看个小样例:

创建一个path,加入一个实心圆到path里

mEndPath = new Path();
mEndPath.addCircle(300, 300, 100, Direction.CW);

绘制该path:

canvas.drawPath(mEndPath, mPaint);

效果例如以下,无可厚非:

Path相关评论的方法(一)

此时在path里再加入一个矩形:

mEndPath = new Path();
mEndPath.addCircle(300, 300, 100, Direction.CW);
mEndPath.addRect(new RectF(50, 50, 250, 200), Direction.CW);

效果例如以下:

Path相关评论的方法(一)

做例如以下修改:

mEndPath = new Path();
mEndPath.addCircle(300, 300, 100, Direction.CW);
//mEndPath.addRect(new RectF(50, 50, 250, 200), Direction.CW);

mSrcPath = new Path();
mSrcPath.addRect(new RectF(50, 50, 250, 200), Direction.CW);
mEndPath.set(mSrcPath);

直接执行,假设在4.0以上的机器上(4.0及以上硬件加速默认开启),会发现屏幕上什么都没有了,说明该方法会受到硬件加速的影响,关掉硬件加速,再看效果:

Path相关评论的方法(一)

以下一起来看看Path 的 FillType - 填充模式:

android里定义了四种FillType,各自是:

 WINDING          (0),

 EVEN_ODD         (1),

 INVERSE_WINDING    (2),

 INVERSE_EVEN_ODD   (3)

有张图能够专门用来说明这四种模式的区别:

Path相关评论的方法(一)

以上图示已经很清晰,我们还是用例如以下代码做下測试:

mEndPath = new Path();mEndPath.addCircle(300, 300, 150, Direction.CW);mEndPath.addCircle(380, 380, 150, Direction.CW);mEndPath.setFillType(FillType.INVERSE_EVEN_ODD);mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setStyle(Style.FILL);mPaint.setColor(Color.RED);

測试结果例如以下图:

Path相关评论的方法(一)

不设置FillType:

Path相关评论的方法(一)           Path相关评论的方法(一)

setFillType(FillType.WINDING)          setFillType(FillType.EVEN_ODD): 


Path相关评论的方法(一)           Path相关评论的方法(一)

setFillType(FillType.INVERSE_WINDING):   setFillType(FillType.INVERSE_EVEN_ODD):


依据以上图示,Path的FillType能够总结例如以下:

1.Path的默认FillType为 FillType.WINDING;

2.作用的范围为绘制 Path 的 Canvas 总体。而非 path 所在区域;

3.FillType.WINDING:取path全部所在区域;

4.FillType.EVEN_ODD:取path所在并不相交区域;

5.FillType.INVERSE_WINDING:取path全部未占区域;

6.FillType.INVERSE_EVEN_ODD:取path未占或相交区域;

以下看看和填充模式相关的几个方法:

getFillType():不用多说。返回 Path 的填充模式;

setFillType():设置 Path 的填充模式;

isInverseFillType():是否是 逆 填充模式:

WINDING 和 EVEN_ODD 返回false,INVERSE_WINDING 和 INVERSE_EVEN_ODD 返回true。

toggleInverseFillType():切换相反的填充模式。举个小样例:

        mEndPath = new Path();        mEndPath.addCircle(300, 300, 150, Direction.CW);        mEndPath.addCircle(380, 380, 150, Direction.CW);        mEndPath.setFillType(FillType.WINDING);        mEndPath.toggleInverseFillType();        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setStyle(Style.FILL);        mPaint.setColor(Color.RED);

此时给Path设置了WINDING的填充模式,调用toggleInverseFillType()。终于的模式为:

FillType.INVERSE_WINDING

Path相关评论的方法(一)

isEmpty():path是否为空,假设path不包括不论什么线条和曲线,则返回true,否则返回false;

isRect(RectF rect):假设path指定的是一个rect,则返回true,否则返回false。假设返回true & rect 不为null。则将该rect设置为path 的区域;

computeBounds(RectF bounds,boolean exact):计算path所在区域,并将结果写入bounds,假设整个path仅仅包括0或1个点,将返回(0,0,0,0):

用例如以下代码做下測试:

        mComputeRect = new RectF();        mEndPath = new Path();        mEndPath.addCircle(380, 380, 150, Direction.CW);        mEndPath.addRect(new RectF(200, 300, 500, 500), Direction.CW);        mEndPath.computeBounds(mComputeRect, false);        Toast.makeText(                mContext,                "" + mComputeRect.left + "," + mComputeRect.top + "," + mComputeRect.right + ","                        + mComputeRect.bottom,                Toast.LENGTH_LONG).show();

返回结果为(200,230,530,530),即path所含内容的边界区域

Path相关评论的方法(一)

incReserve(int extraPtCount):提示path将会添加extraPtCount个点。这能使path有效率的分配它的存储空间。


好了,这篇就主要介绍这些方法。后面主要介绍 Path 里 XXXTo 和 addXXX 相关的方法,最后我们再一起用Path做个样例!


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117820.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 40个容易上瘾的HTML5网页游戏,总有一款适合你[通俗易懂]

    40个容易上瘾的HTML5网页游戏,总有一款适合你[通俗易懂]我记得姐姐家的孩子在刚刚才学会走路,说话还不能完整的时候就已经能自己用小手点出小游戏的网站来一个人自娱自乐。我一直在想这一代跟着计算机一起茁壮成长的孩子会不会也和美国那一代人一样,出现9岁的黑客和计算机天才。但是并不是信息的成长就能让教育同步。很多时候我们会发现教育在发展的大环境中并没有什么创新的思考。不管怎么说,我们还是需要小盆友们能有足够的想象力。不要被束缚!今天分享的是40个HTML5的网页

  • python pandas fillna_python rfind函数

    python pandas fillna_python rfind函数本文概述我们可以使用fillna()函数填充数据集中的空值。句法DataFrame.fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs)参数值:它是一个用于填充空值的值,或者是一个Series/dict/DataFrame。method:一种用于填充重新…

  • 用户测试用例模板「建议收藏」

    用户测试用例模板「建议收藏」用户测试用例模板

  • Linux服务器ldap启动,linux搭建ldap服务器详细步骤

    Linux服务器ldap启动,linux搭建ldap服务器详细步骤ldap这种原始的服务器搭建起来比较复杂,同时它也是CE必考的(客户端的搭建)。1、安装openldap-servers软件包2、查看ldap模板文件的存放位置:3、拷贝ldap模板文件到配置文件目录并修改文件名为slapd.conf。4、删除/etc/openldap目录下原有的文件,保留下这几个文件,注意:以前学时是要删除schema文件,直留下三个,但是我测试时如果删除schema服务将失败…

  • ssm框架过时了吗_spring实战

    ssm框架过时了吗_spring实战SpringSpring是一个开源的免费的框架Spring是一个轻量级的,非入侵式的框架控制反转(IOC),面向切面编程(AOP)支持事务的处理,对框架整合的支持IOC理论UserDaoUserDaoImpUserSeviceUserServiceImp在之前,用户的需求可能会影响原来的代码。使用一个set。public void setUserDao(UserDao userDao){ this.userDao = userDao;}之前是主动创建对象,控制

  • linux下patch文件使用

    linux下patch文件使用初识patch还是和Z同事沟通问题时认识的,回想起已经近半年

    2022年10月21日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号