背景
希望给相对布局中的所有子控件增加一个统一的遮罩层.
问题
增加遮罩层,就涉及到addView时需要指定增加的这个view的宽高.但是如果在activity的onCreate方法就调用动态 添加方法的话,会导致添加失败.因为此时视图还未绘制出来,父控件的宽高为0.
解决方法
调用父控件viewTreeObserver的addOnPreDrawListener方法,在这个方法里进行动态添加.
代码样例:
/**
* 动态添加遮罩层view。
* 通过调用viewTreeObserver的addOnPreDrawListener方法,可以在视图绘制前进行添加。
* 因为此时视图已经经过了onMeasure,知道了自己的宽高。
*/
private fun addView(viewGroup: ViewGroup, maskView: View?) {
viewGroup.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
viewGroup.viewTreeObserver.removeOnPreDrawListener(this)
viewGroup.addView(maskView, viewGroup.width, viewGroup.height)
return true
}
})
}