android - 为轮廓提供者创建凸路径
问题描述
我尝试为大纲提供者创建凸路径。我需要一个带有圆形左上角和右上角的矩形。有一种方法可以做到这一点,但问题是:我的凸路径有什么问题?它像凸面一样绘制油漆,在几何上应该没问题。
(是的,我知道 public void addRoundRect(float left, float top, float right, float bottom, @NonNull float[] radii, @NonNull Direction dir))
我的 ConvexView 有实现
val Int.toPx: Int
get() = (this * Resources.getSystem().displayMetrics.density).toInt()
class ConvexView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val paint = Paint().apply {
isAntiAlias = true
color = Color.RED
strokeWidth = 5f
style = Paint.Style.STROKE
}
private val convexPath = Path()
val r = 24.toPx.toFloat()
val d = r * 2
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
with (convexPath) {
reset()
arcTo(0f, 0f, d, d, -90f, -90f, true)
lineTo(0f, measuredHeight.toFloat())
lineTo(measuredWidth.toFloat(), measuredHeight.toFloat())
lineTo(measuredWidth.toFloat(), r)
arcTo(measuredWidth.toFloat() - d, 0f,
measuredWidth.toFloat(), d,
0f, -90f, true)
lineTo(r, 0f)
}
Log.d("CONVEX", "Path is convex = ${convexPath.isConvex}")
}
override fun onDraw(canvas: Canvas?) {
canvas?.save()
canvas?.drawPath(convexPath, paint)
canvas?.restore()
}
}
但是路径仍然不是凸的
解决方案
在第二个 arcTo() 调用中,您需要指定最后一个参数 forceMoveTo=false。arcTo(.... , true) 终止路径一次。所以它绘制了两条永远不会凸出的独立路径。
推荐阅读
- haskell - 使用 Hspec 编写嵌套断言
- kubernetes - Gitlab Kubernetes 应用程序的自定义 DNS
- javascript - 有人可以解释一下这个与 Js 回调函数有关的代码吗?我对这段代码很困惑,可能是因为我是初学者。问题是:
- swift - 在 swift 中使用滑块在单元格中设置自动调整大小
- image - 来自不同注册表的 OKD / OpenShift 导入图像错误
- python - 如何从 django shell 中的脚本保存多个对象
- java - 布吉;如何通过单击单个聊天消息触发多个 ClickEvent RUN_COMMAND 操作
- python - Discord.py 和 SQL - 比较同一数据库文件中的 2 个表
- r - R通过匹配gps坐标来推断缺失数据以找到缺失数据,然后将缺失数据放回原始数据框中
- python - Numpy子数组影响原始二维数组