我误会Android绘制了

背景

需求涉及到创建View,要求能在指定位置创建View。

在此之前的理解是需要等到View attach到window上才能获取到View的宽高。按照这种思路,先创建一个View,添加到父View,再调整View的位置,尝试后效果不是很理想,会有View位置的变化,视觉上看有闪烁的效果。

尝试通过ChatGPT解决,有了以下对话:

与ChatGPT的问话

View的绘制是可以在外部调用的,方法声明public。 所以,View设置内容后可以调用一遍measure方法以确定大小。

private fun fixedPosition(view: View) {
    view.layoutParams = FrameLayout.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT
    )
    view.measure(
        View.MeasureSpec.UNSPECIFIED,
        View.MeasureSpec.UNSPECIFIED
    )
    val viewWidth = view.measuredWidth
    val viewHeight = view.measuredHeight

    val layoutParams = FrameLayout.LayoutParams(
        FrameLayout.LayoutParams.WRAP_CONTENT, // 宽度
        FrameLayout.LayoutParams.WRAP_CONTENT // 高度
    ).apply {
        marginStart = (x - viewWidth / 2).toInt() // 左边界坐标
        topMargin = (y - viewHeight / 2).toInt() // 上边界坐标
    }
    view.layoutParams = layoutParams
}

事后反思是因为先入为主的观念,认为既然View的绘制发生在View内部,就不能允许在外部调用。至于是不是这样,没有深入研究,值得注意。