개발 과정에서, 긴 텍스트를 입력할 때 노드가 화면 밖으로 나가는 문제가 발생했다.

처음엔 노드의 Scale 값을 조정해 문제를 해결하려 시도했지만, 노드의 수가 많아지면서 이 방법의 한계에 도달했다

스크린샷 2023-11-23 오후 6.24.53.png

override fun onMeasure(
        widthMeasureSpec: Int,
        heightMeasureSpec: Int,
    ) {
        var width = 0
        var height = 0
        for (index in 0 until childCount) {
            val child = getChildAt(index)
            measureChild(child, widthMeasureSpec, heightMeasureSpec)
            width = maxOf(width, child.measuredWidth)
            height = maxOf(height, child.measuredHeight)
        }
        setMeasuredDimension(
            resolveSize(width, widthMeasureSpec),
            resolveSize(height, heightMeasureSpec),
        )
    }

이를 해결하기 위해, onMeasure'함수를 사용하여 각 자식 뷰의 크기를 측정했다. 이를 통해 부모 뷰가 차지해야 할 최대 너비와 높이를 결정했다.

그러나, 새로운 노드를 추가할 때마다 기존의 노드가 상단으로 이동해, 노드가 화면에서 잘리는 문제가 여전히 발생했다.

override fun onLayout(
        changed: Boolean,
        l: Int,
        t: Int,
        r: Int,
        b: Int,
    ) {
        val childCount = childCount
        for (index in 0 until childCount) {
            val child = getChildAt(index)
            val childLeft =
                (paddingLeft + (child.layoutParams as MarginLayoutParams).leftMargin)
            val childTop =
                (paddingTop + (child.layoutParams as MarginLayoutParams).topMargin)
            val childRight = Int.MAX_VALUE
            val childBottom = Int.MAX_VALUE
            child.layout(childLeft, childTop, childRight, childBottom)
        }
    }

이 문제를 해결하기 위해 onLayout을 사용하여 부모 뷰 내의 자식 뷰 위치를 지정하는 방법을 시도했다.

각 자식 뷰의 왼쪽과 상단 위치를 계산하고, 여백을 고려하여 패딩을 추가했다.

이후, 오른쪽과 하단 부분에 대해서는 최대 크기 값을 설정했다.

fun arrangeNode(tree: Tree) {
        val root = tree.getRootNode()
        val totalHeight = measureChildHeight(root, tree)
        val newHead =
            if (root.path.centerX.dpVal <= (totalHeight / 2).dpVal) {
                val newPath =
                    root.path.copy(
                        centerY = totalHeight / 2 + horizontalSpacing,
                    )
                root.copy(path = newPath)
            } else {
                root
            }
        tree.setRootNode(newHead)
        recurArrangeNode(newHead, tree)
    }

더 나아가, RootNode를 중심으로 노드의 위치가 결정되므로, 자식 노드가 추가될 때마다 RootNode의 위치를 조정해야 했다.

트리를 정렬하는 코드에서는, RootNode에 대한 최상단 및 최하단 노드의 위치를 계산하고, 그 중앙에 위치할 수 있도록 조정했다.

스크린샷 2023-11-23 오후 6.48.30.png

이러한 접근 방식으로, 새로운 노드가 생성될 때마다 화면을 벗어나는 문제를 효과적으로 해결할 수 있었다. 이 과정에서 노드의 동적인 위치 조정과 부모-자식 뷰 간의 관계를 재구성하는 방법을 통해, 화면 내에서의 노드 관리가 개선되었다.