Android 绘制 Path

Path.Direction

  • 顺时针 Path.Direction.CW

  • 逆时针 Path.Direction.CCW

    mPath.addCircle(dp2px(100F), dp2px(100F), dp2px(50F), Path.Direction.CW)
    mPath.addCircle(dp2px(180F), dp2px(100F), dp2px(50F), Path.Direction.CW)
      
    从任意一点画线,与顺时针的边界相交 +1, 与逆时针的边界相交 -1, 结果为 0 表示在外部, 否则为内部
    

Path.FillType

  • Path.FillType.EVEN_ODD 不考虑方向, 穿插奇数次为内部, 偶数次为外部

    mPath.fillType = Path.FillType.EVEN_ODD
    

Math

println(sin(Math.toRadians(30.0)))      结果: 0.49999999999999994
println(sin(Math.toRadians(150.0)))     结果: 0.49999999999999994
println(cos(Math.toRadians(30.0)))      结果: 0.8660254037844387
println(cos(Math.toRadians(150.0)))     结果: -0.8660254037844387
  • 这里根据正余弦的图可以想到,

    正弦值 30° 和 150° 都在 x 轴上方, 相对于 90° 对称, 所以结果相等
    余弦值 30° 在 x 轴上方, 150° 在 x 轴下方, 大小相等, 方向相反 
    

PathDashPathEffect

  • 这个本来是用来画虚线的, 但是画刻度也是可以的, 理解成弯曲的垂直曲线…

    Path shape      虚线的样子, 通过 addRect(0F, 0F, dp2px(2F), dp2px(10F), Path.Direction.CW) 设置成指定大小的矩形
    float advance   两个虚线之间的间隔 
    float phase     开始绘制的时候的偏移
    Style style     style, 这个还没搞懂, 但是效果先出来了...
    
    // 绘制刻度
    mPaint.pathEffect = mPathEffect
    canvas.drawArc(mRectF, 90F + mAngle / 2F, 360F - mAngle, false, mPaint)
    mPaint.pathEffect = null
    

饼图其中一块偏移

要将 A 块偏移出去, 思路是计算要偏移出去的角度, 然后根据要偏移出去的距离的 cos/sin 函数, 计算出 translation x/y 坐标

偏移的角度是 A 块的开始角度 + A块总共的大小的一半

x: cos(Math.toRadians(currAngle + ANGLES[i] / 2.0)).toFloat() * PULLED_LENGTH
y: sin(Math.toRadians(currAngle + ANGLES[i] / 2.0)).toFloat() * PULLED_LENGTH
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值