自定义view绘制太极图案

  • 需要的知识点:canvas.drawPath(),path的布尔运算,path绘制图案

  • path的布尔运算

  /**
     * Set this path to the result of applying the Op to this path and the specified path.
     * The resulting path will be constructed from non-overlapping contours.
     * The curve order is reduced where possible so that cubics may be turned
     * into quadratics, and quadratics maybe turned into lines.
     *
     * @param path The second operand (for difference, the subtrahend)
     *
     * @return True if operation succeeded, false otherwise and this path remains unmodified.
     *
     * @see Op
     * @see #op(Path, Path, android.graphics.Path.Op)
     */
    public boolean op(Path path, Op op) {
        return op(this, path, op);
    }

可以看到需要传递参数path和 op

第一个参数path的东西太多了,有空大家自己去看看文档
第二个参数op 就定义了几个属性

 /**
     * The logical operations that can be performed when combining two paths.
     *
     * @see #op(Path, android.graphics.Path.Op)
     * @see #op(Path, Path, android.graphics.Path.Op)
     */
    public enum Op {
        /**
         * Subtract the second path from the first path.
         */
        DIFFERENCE,
        /**
         * Intersect the two paths.
         */
        INTERSECT,
        /**
         * Union (inclusive-or) the two paths.
         */
        UNION,
        /**
         * Exclusive-or the two paths.
         */
        XOR,
        /**
         * Subtract the first path from the second path.
         */
        REVERSE_DIFFERENCE
    }
  1. DIFFERENCE 数学中叫差集
    取值 path1-path2
    这里写图片描述

    2.INTERSECT 交集
    Path1与Path2相交的部分
    这里写图片描述

    3.UNION 并集
    Path1与Path2的全部部分
    这里写图片描述

    4.XOR
    Path1和Path2的全部去除相交的部分
    这里写图片描述
    5.REVERSE_DIFFERENCE
    这个看名字就知道是和第一个相反

    • 了解了上边的这些,咱们开始绘制太极图案

      首先绘制大体轮廓

canvas.translate(mWith / 2, mHeight / 2);//把坐标移动到中心位置
  Path path1 = new Path();
        Path path2 = new Path();
        Path path3 = new Path();
        Path path4 = new Path();
        Path path5 = new Path();
        Path path6 = new Path();

        path1.addCircle(0, 0, 200, Path.Direction.CW);
        path6.addCircle(0, 0, 200, Path.Direction.CW);
        path2.addRect(0, -200, 200, 200, Path.Direction.CW);
        path5.addRect(-200, -200, 0, 200, Path.Direction.CW);
        path3.addCircle(0, -100, 100, Path.Direction.CW);
        path4.addCircle(0, 100, 100, Path.Direction.CW);

这里写图片描述

  • 接着开始按上边介绍的交集、并集取值
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            /**
             *  绘制白色太极
             */
            //差集 p1减去和p2后剩下的
            path1.op(path2, Path.Op.DIFFERENCE);
            //并集
            path1.op(path3, Path.Op.UNION);
            path1.op(path4, Path.Op.DIFFERENCE);
            canvas.drawPath(path1, mPaint);

            /**
             *  绘制黑色太极
             */
            mPaint.setColor(Color.BLACK);
            path6.op(path5, Path.Op.DIFFERENCE);
            path6.op(path4, Path.Op.UNION);
            path6.op(path3, Path.Op.DIFFERENCE);
            canvas.drawPath(path6, mPaint);
        }
  • 绘制太极里边的小圆点
 /**
     * 绘制太极图案中的小圆点
     * @param canvas 画布
     */
    private void drawSmallCircle(Canvas canvas) {
        Path pathBlack = new Path();
        Path pathWhite = new Path();
        mPaint.setColor(Color.BLACK);
        pathBlack.addCircle(0, -100, 20, Path.Direction.CW);
        canvas.drawPath(pathBlack, mPaint);

        mPaint.setColor(Color.WHITE);
        pathWhite.addCircle(0, 100, 20, Path.Direction.CW);
        canvas.drawPath(pathWhite, mPaint);
    }

最后效果图
这里写图片描述

下载地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值