我有一个关于Android视图的问题似乎已被多次询问过。但我仍然得不到我需要的答案。 我必须创建一个视图,根据给定的百分比改变它的大小(高度)。这意味着,我想要像
这样的东西setHeight(percentage){
view.setHeight(Originl * percentage)
}
为了做到这一点,我需要视图的原始高度而不做任何更改或外部布局(因此没有Match_Parent)。 有许多方法和可能的时刻来计算视图高度,但它们似乎都有当前的高度 - 而不是"期望"之一。
例如,我尝试使用onMeasure(),因为这是测量视图的时刻,但在更改视图高度时也会调用它。它也是在视图"创建"好几次。因此,我甚至无法获取第一个值,因为它有时会被调用两次,第一次测量会给出错误的数据(例如,高度为0,直到第二次onMeasure给出真实值)。
我现在做的事情也不是很好,但似乎有效。我添加了一个像这样的监听器
getViewTreeObserver().addOnGlobalLayoutListener( this)
并在回调方法中删除了监听器
override fun onGlobalLayout() {
Log.d("OnGlobalLayout", "Height: $height")
originalHeight = height
getViewTreeObserver().removeOnGlobalLayoutListener( this)
}
这似乎或多或少有效,但真的是这样做吗?我希望有一些方法可以获得预期的视图大小,无论当前的大小是什么。
任何想法如何做到这一点?
答案 0 :(得分:1)
您可以为此类视图编写一次扩展名
inline fun View.afterMeasured(crossinline f: View.() -> Unit) {
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
if (measuredHeight > 0 && measuredWidth > 0) {
viewTreeObserver.removeOnGlobalLayoutListener(this)
f()
}
}
})
}
不只是写
mView.afterMeasured {
// inside this block the view is completely drawn,
// here you have an access for its height and width
}