在某些 child 视图前绘制

Draw in front of certain child views

我有一个包含 header 和一圈菜单项的 ViewGroup。基本上我有一个 closing/opening 动画,其中我的项目视图位于 header 视图后面。由于所有视图都有透明胶片,当项目视图位于 header 视图后面时,它们仍然可见并最终通过透明胶片出现在 header 视图后面。

我想做的是将项目视图与 hweader 视图相交,删除交集。我想出的是覆盖 dispatchDraw 并做类似 PorterDuff.Mode.CLEAR

的事情

但从某种意义上说,我只能一次对所有视图执行此操作。使用下面的代码,它将擦除在该特定区域的视图中绘制的所有内容,因此 header 也是如此。

@Override
protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    //do stuff here
}

有什么方法可以重新绘制视图,甚至 select 我想删除哪些视图?

仅供将来参考,这就是我所做的。覆盖调度绘制,擦除给定区域并使用 child.draw(canvas)

再次绘制 child
@Override
protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    Paint p = new Paint();
    p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    canvas.drawCircle((float) center.x, (float) center.y, headerSize / 2, p);
    canvas.save();
    canvas.translate(padding, padding);
    getChildAt(0).draw(canvas);
    canvas.restore();
}