在自定义视图中绘制自定义视图

时间:2018-01-21 01:19:28

标签: android tree kotlin android-view android-custom-view

我正在开发一个自定义视图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。绘制矩形所在的线(即节点之间的连接),并且这部分代码没有被改变。

所以我的问题是如何在另一个自定义视图中绘制自定义视图,以便我可以获得我所描述的效果?

0 个答案:

没有答案