Android View获取原创内容" Wrap Content"我的观点的大小

时间:2017-09-11 11:12:26

标签: android view kotlin

我有一个关于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)
}

这似乎或多或少有效,但真的是这样做吗?我希望有一些方法可以获得预期的视图大小,无论当前的大小是什么。

任何想法如何做到这一点?

1 个答案:

答案 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
    }