我有一个自定义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
。如何解决此问题,或者解决此问题的更好方法是什么?
我使用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()
不起作用,如果它没有父级并且尚不可见。