Skip to content

Справочник API: Region

Класс Region представляет сложную область на холсте, похожую на Path, но определяемую координатами в целых числах. Регионы оптимизированы для булевых операций (таких как пересечение, объединение, разность) и проверки, находится ли точка или прямоугольник внутри области.

Обзор

В отличие от Path, который использует координаты с плавающей запятой и может содержать кривые, Region по своей сути является набором горизонтальных строк сканирования. Он эффективен для проверки попадания (hit-testing) и отсечения (clipping).

Создание и изменение регионов

java
// Создать пустой регион
Region region = new Region();

// Установить его как прямоугольник
region.setRect(new IRect(0, 0, 100, 100));

// Установить его из Path
// (Требуется регион 'clip' для определения максимальных границ)
Path path = new Path().addCircle(50, 50, 40);
Region clip = new Region();
clip.setRect(new IRect(0, 0, 200, 200));
region.setPath(path, clip);

Булевы операции

Сила Region заключается в его способности комбинировать несколько областей с помощью логических операторов.

java
Region regionA = new Region();
regionA.setRect(new IRect(0, 0, 100, 100));

Region regionB = new Region();
regionB.setRect(new IRect(50, 50, 150, 150));

// Пересечение: Результат - область перекрытия (50, 50, 100, 100)
regionA.op(regionB, RegionOp.INTERSECT);

// Объединение: Результат - объединенная область обоих регионов
regionA.op(regionB, RegionOp.UNION);

// Разность: Удалить B из A
regionA.op(regionB, RegionOp.DIFFERENCE);

Доступные операции (RegionOp):

  • DIFFERENCE: A - B
  • INTERSECT: A & B
  • UNION: A | B
  • XOR: (A | B) - (A & B)
  • REVERSE_DIFFERENCE: B - A
  • REPLACE: B

Проверка попадания (Hit Testing)

Вы можете проверить, находится ли точка или прямоугольник внутри региона.

java
if (region.contains(10, 10)) {
    // Точка находится внутри
}

if (region.quickReject(new IRect(200, 200, 300, 300))) {
    // Прямоугольник точно ВНЕ региона
}

Использование с Canvas

Вы можете использовать Region для отсечения (clipping) на Canvas.

java
canvas.clipRegion(region);

Примечание: Операции с Region (такие как setPath) строго основаны на целых числах. Кривые будут аппроксимированы небольшими шагами. Для высокоточного рендеринга предпочтительнее использовать Path. Region лучше всего подходит для сложной проверки попадания в UI или для пиксельно выровненных масок отсечения.