JavaFX Круговой вырез - PullRequest
       4

JavaFX Круговой вырез

0 голосов
/ 30 апреля 2018

Я занимаюсь разработкой настольного приложения JavaFX и хочу наложить круговой видовой экран на другую панель.

Вот очень простое изображение, изображающее то, что я хочу, белая область была бы прозрачной и показывающей нижнюю панель. Черная область будет сплошным цветом и предотвратит срабатывание событий мыши на базовой панели.

Example

Я рассмотрел использование Canvas с подключенным слушателем событий, который игнорирует все события в радиусе окружности, но мне интересно, есть ли более эффективный / менее хакерский метод для этого?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 апреля 2018

Установите соответствующее значение Shape в свойстве clip на передней панели Node.

Javadoc из свойства clip:

Указывает узел, который будет использоваться для определения формы отсечения для этого узла. Этот ограничивающий узел не является потомком этого узла в смысле графа сцены. Скорее, он используется для определения клипа для этого узла.

Например, вы можете использовать узел ImageView в качестве маски для представления клипа. Или вы можете использовать один из узлов геометрической формы, такой как Прямоугольник или Круг. Или вы можете использовать текстовый узел для представления клипа.

См. Документацию класса для Node для ограничений структуры графа сцены при настройке клипа. Если эти ограничения нарушаются изменением переменной clip, изменение игнорируется и восстанавливается предыдущее значение переменной clip.

Обратите внимание, что это условная функция. См. ConditionalFeature.SHAPE_CLIP для получения дополнительной информации.

Существует известное ограничение смешивания клипа с трехмерным преобразованием. Отсечение - это, по сути, операция с 2D-изображением. Результат набора клипов на узле группы с преобразованными потомками 3D приведет к тому, что его потомки будут отображаться в порядке без применения Z-буферизации между этими потомками.

В любом случае, вы можете использовать Rectangle того же размера, что и Node. Затем создайте Circle с центром в Rectangle с нужным радиусом. Из этих двух фигур создайте новую форму, используя Shape.subtract(rectangle, circle);. Это создаст «дыру» в середине Rectangle, которая покажет любую лежащую в основе Node.

Пример кода:

private void setClipViewport(Region region) {
    int width = region.getWidth();
    int height = region.getHeight();

    Rectangle rect = new Rectangle(0, 0, width, height);
    Circle circ = new Circle(width / 2, height / 2, Math.min(width, height) / 2);

    Shape clip = Shape.subtract(rect, circ);

    region.setClip(clip);
}

Однако мой пример не изменит размер клипа при необходимости. Поэтому, если ваш пользовательский интерфейс может изменить размер, вам нужно добавить это поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...