joy keeps flowin'

我误会Android绘制了

xx

背景 #

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

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

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

与ChatGPT的问话

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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内部,就不能允许在外部调用。至于是不是这样,没有深入研究,值得注意。

标签:
Categories: