除此之外,我希望 RGB 边框的属性是可配置的,例如。应该能够根据需要更改笔划宽度。但是,我面临几个问题:
- 倒三角的底边无法去除(RGB 边框线底部不应该是直的)
- 如果我尝试更改 RGB 线的宽度(使用 paint.setStrokeWidth()),它会在它们之间引入不希望的间隙,而我希望它们是连续的。我确定我犯了一些计算错误,但无法弄清楚。
- 我已经体验过使用 lineTo on Path 沿视图边缘绘制一条线是用 Paint 上设置的笔划宽度的一半绘制的。但是,我无法找到相同的任何阅读材料。有人可以启发我吗?
自定义视图的 onDraw 方法如下:
override fun onDraw(canvas: Canvas?) {
outerBorderPath.reset()
mainBorderPath.reset()
innerBorderPath.reset()
///let's draw our content first
canvas?.let { drawingCanvas ->
outerBorderPath.addRect(outerBorderWidth.toFloat(),outerBorderWidth.toFloat(),width.toFloat() - outerBorderWidth, (height - arrowHeight - outerBorderWidth).toFloat(), Path.Direction.CW)
outerBorderPath.addPath(mArrowPath, width.toFloat() - arrowWidth - 100,
(height - arrowHeight - outerBorderWidth).toFloat()
)
drawingCanvas.drawPath(outerBorderPath, outerBorderPaint)
mainBorderPath.addRect(outerBorderWidth + mainBorderWidth.toFloat(),
outerBorderWidth + mainBorderWidth.toFloat(),
width.toFloat() - outerBorderWidth - mainBorderWidth,
(height - arrowHeight - outerBorderWidth - mainBorderWidth).toFloat(),
Path.Direction.CW
)
mainBorderPath.addPath(mainArrowPath, width.toFloat() - arrowWidth + (outerBorderWidth/2) - 100,
(height - arrowHeight - outerBorderWidth - mainBorderWidth).toFloat()
)
drawingCanvas.drawPath(mainBorderPath, mainBorderPaint)
innerBorderPath.addRect(outerBorderWidth + mainBorderWidth + innerBorderWidth.toFloat(),
outerBorderWidth + mainBorderWidth*1f + innerBorderWidth,
width.toFloat() - outerBorderWidth - mainBorderWidth*1f - innerBorderWidth,
(height - arrowHeight - outerBorderWidth - mainBorderWidth*1f - innerBorderWidth).toFloat(),
Path.Direction.CW
)
innerBorderPath.addPath(innerArrowPath, width.toFloat() - arrowWidth + (outerBorderWidth + mainBorderWidth)/2 - 100,
(height - arrowHeight - outerBorderWidth - mainBorderWidth - innerBorderWidth).toFloat()
)
drawingCanvas.drawPath(innerBorderPath, innerBorderPaint)
}
///translate canvas to the child can be drawn now
canvas?.save()
super.onDraw(canvas)
canvas?.restore()
}
另外,视图类的onMeasure如下:
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
setMeasuredDimension(
(measuredWidth + (2 * outerBorderWidth) + (2 * innerBorderWidth) + (2 * innerPadding)).toInt(),
(measuredHeight + (2 * outerBorderWidth) + (2 * innerBorderWidth) + (2 * innerPadding) + arrowHeight).toInt()
)
}