dispatchDraw идет на l oop, Изменить видимость без повторного вызова dispatchDraw - PullRequest
0 голосов
/ 13 марта 2020

У меня есть пользовательская 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 (он рисовал только за видом), затем я обрезал круг, установил Видимость спереди и перерисовка снова.
Вот результат:
result

Проблема в том, что dispatchDraw функция переходит на l oop, потому что .setVisibility() вызывает это dispatchDraw снова.
Как решить эту проблему или как лучше подходить к этому результату?

1 Ответ

0 голосов
/ 14 марта 2020

Мне удалось получить тот же результат с помощью функции 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(), если у него нет родителя и уже не видно.

...