自定义View--太极图

最近学习自定义view,一时兴起,做了个太极图,效果如下:

绘制步骤:

  • 绘制一个圆心为屏幕中心,半径为r的黑色填充圆,添加宽为r,高为2r的矩形,取他两之间的差集,得到半圆。

  • 绘制两个半径为r/2的小圆,一个取并集,一个取差集,得到黑色阴阳鱼。

  • 绘制两个半径为r/8,圆心为小圆半径的更小圆,一个取并集,一个取差集,为阴阳鱼加上眼,不过白色阴阳鱼还没成型。

  • 最后绘制大圆,并添加自旋转动画。

代码附上:

protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPaint = new Paint();
        canvas.translate(mViewWidth / 2, mViewHeight / 2);//将原点移到屏幕中心,其实是移动画布

        mPaint.setColor(Color.BLACK);
        mPaint.setStrokeWidth(5);
        mPaint.setAntiAlias(true);//抗锯齿

        float r = (float) (mViewWidth / 2 * 0.8);

        Path path1 = new Path();
        Path path2 = new Path();
        Path path3 = new Path();
        Path path4 = new Path();
        Path path5 = new Path();
        Path path6 = new Path();

        mPaint.setStyle(Paint.Style.FILL);
        path1.addCircle(0, 0, r, Path.Direction.CW);
        path2.addRect(0, -r, r, r, Path.Direction.CW);
        path3.addCircle(0, -r / 2, r / 2, Path.Direction.CW);
        path4.addCircle(0, r / 2, r / 2, Path.Direction.CCW);
        path5.addCircle(0, -r / 2, r / 8, Path.Direction.CW);
        path6.addCircle(0, r / 2, r / 8, Path.Direction.CW);

        path1.op(path2, Path.Op.DIFFERENCE);//取差集,即path1减去path2后剩下的部分,得到半圆
        path1.op(path3, Path.Op.UNION);//取并集,即两者相加
        path1.op(path4, Path.Op.DIFFERENCE);
        path1.op(path5, Path.Op.DIFFERENCE);
        path1.op(path6, Path.Op.UNION);

        canvas.drawPath(path1, mPaint);
        //绘制外圈
        mPaint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(0, 0, r, mPaint);
    }

自旋转代码:

        //添加旋转动画
        RotateAnimation animation = new RotateAnimation(0f, 360f,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        LinearInterpolator linearInterpolator = new LinearInterpolator();
        animation.setInterpolator(linearInterpolator);
        animation.setDuration(5000);
        animation.setFillAfter(true);//保持最后状态
        animation.setRepeatMode(Animation.RESTART);
        animation.setRepeatCount(Animation.INFINITE);//无限循环
        taijiView.startAnimation(animation);

参考链接:https://www.gcssloop.com/customview/Path_Over

围观自定义view大佬博客:GcsSloop

我的GitHub:太极图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值