在CustomViewGroup中布局子节点



我有一个自定义ViewGroup和我重写onLayout方法来布局它的子。每次onLayout被调用时都需要一些子元素被布局。问题是,当我调用requestLayout()的孩子,我不布局他们显示从上次调用。

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    .
    .
    .
    // calculate a and b parameter
    for (int i = a; i < b ; i++) {
        getChildAt(i).layout(l, t ,r ,b );
    }

}

问题是如何隐藏从布局或清除ViewGroup和布局的孩子?

如果有人仍然有这个问题,我的解决方案是解决所有的子视图在onLayout:

  • set visibility = View。在我想要显示的
  • 上的可见和调用布局
  • set visibility = View。对于那些我想要隐藏的(并且不要调用它们的布局)。如果他们已经在那里了,你不能只是不把他们放在那里。

或者,其他人建议你可以重写onDraw并清除画布:

 override fun onDraw(canvas: Canvas?) {
        // clear if new layout to get rid of unused views:
        if(clearCanvas) {  
            canvas?.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
            clearCanvas = false;
        }
        super.onDraw(canvas)
    }

在onLayout中设置clearCanvas = true,当您知道事情发生了变化时,调用invalidate()

然而,我不能让它调用我的onDraw()函数!因此,虽然这看起来更干净,但我仍然缺少一些东西…

最新更新