dispatchDraw进入循环,无需再次调用dispatchDraw即可更改视图的可见性

问题描述 投票:0回答:1

我有一个自定义ViewGroup,其中有2个子视图,与父视图匹配,一个与另一个视图匹配,一个在前面,一个在后面。我想在正视图中切出一个圆圈,以便在该圆圈中可以看到后视图。我用dispatchDraw功能做到了,代码如下:

 protected void dispatchDraw(Canvas canvas) {
    System.out.println("dispatchDraw");
    views.get(1).setVisibility(GONE);        //views variable is list of child views
    super.dispatchDraw(canvas);
    Path pathHole = new Path();
    pathHole.addCircle(touchPos[0], touchPos[1], 100, Path.Direction.CW);
    canvas.clipPath(pathHole, Region.Op.DIFFERENCE);
    views.get(1).setVisibility(VISIBLE);
    super.dispatchDraw(canvas);
}

[基本上,我要做的是隐藏前视图并绘制ViewGroup(它仅在视图后方绘制),然后我切出一个圆形路径,设置前视图的可见性并再次重绘。结果如下:“结果”

问题是dispatchDraw函数进入循环,因为.setVisibility()再次调用了此dispatchDraw。如何解决此问题,或者解决此问题的更好方法是什么?

android canvas view draw
1个回答
0
投票

我使用view.draw(canvas);功能管理了相同的结果。我没有在ViewGroup上添加视图,而是将它们保存在ListArray中。然后在dispatchDraw中执行以下操作:

 protected void dispatchDraw(Canvas canvas) {
    System.out.println("dispatchDraw");
    views.get(0).measure(canvas.getClipBounds().width(), canvas.getClipBounds().height());
    views.get(0).layout(0, 0, canvas.getClipBounds().width(), canvas.getClipBounds().height());
    views.get(0).draw(canvas);
    Path pathHole = new Path();
    pathHole.addCircle(touchPos[0], touchPos[1], 100, Path.Direction.CW);
    canvas.clipPath(pathHole, Region.Op.DIFFERENCE);
    views.get(1).measure(canvas.getClipBounds().width(), canvas.getClipBounds().height());
    views.get(1).layout(0, 0, canvas.getClipBounds().width(), canvas.getClipBounds().height());
    views.get(1).draw(canvas);   
}

我以前尝试过,但是我不知道如果没有.draw(canvas).measure()函数,.layout()不起作用,如果它没有父级并且尚不可见。

© www.soinside.com 2019 - 2024. All rights reserved.