我正在开发一个自定义视图TreeView
,它会显示给定根节点的树。我使用的是Kotlin语言。
此处的目标是:
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
drawNodeAndChildren(canvas, rootNode)
}
/**
* Draws a representation of a node and its children onto the canvas.
* ...
*/
private fun drawNodeAndChildren(canvas: Canvas, node: TreeNode<Person>, ...): Int {
...
// Calculate coordinates of rect
val top = ...
val bottom = ...
val left = ...
val right = ...
// Draw node representation
val rect = RectF(left, top, right, bottom)
canvas.drawRect(rect, nodePaint)
// Draw line to connect to parent
...
// Repeat for children
...
}
这项工作成功,我能够生成一个可视化树,其中矩形代表父母和孩子之间的节点和线。
但是,我希望能够显示该人的图像和文字。我编写了一个名为PersonView
的复合视图,它可以在给定Person
对象的情况下执行此操作。理想情况下,将来,用户可以点击PersonView
中的这些TreeView
来触发操作。
基本上,不是矩形,而是绘制PersonView
。
我尝试过编程创建视图并设置其布局参数如下:
...
val personView = PersonView(context).apply { person = node.data }
val layoutParams = ViewGroup.LayoutParams(
(right - left).toInt(), // width
(bottom - top).toInt() // height
)
personView.layoutParams = layoutParams
personView.x = left
personView.y = top
personView.draw(canvas)
...
我也尝试过:
...
val personView = PersonView(context).apply { person = node.data }
personView.layout(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())
personView.draw(canvas)
...
在这两种情况下,都不会绘制任何内容而不是矩形 - 就像上面的两个代码示例没有效果一样。
N.B。绘制矩形所在的线(即节点之间的连接),并且这部分代码没有被改变。
所以我的问题是如何在另一个自定义视图中绘制自定义视图,以便我可以获得我所描述的效果?