Справочник API: Region
Класс Region представляет сложную область на холсте, похожую на Path, но определяемую координатами в целых числах. Регионы оптимизированы для булевых операций (таких как пересечение, объединение, разность) и проверки, находится ли точка или прямоугольник внутри области.
Обзор
В отличие от Path, который использует координаты с плавающей запятой и может содержать кривые, Region по своей сути является набором горизонтальных строк сканирования. Он эффективен для проверки попадания (hit-testing) и отсечения (clipping).
Создание и изменение регионов
// Создать пустой регион
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 заключается в его способности комбинировать несколько областей с помощью логических операторов.
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 - BINTERSECT: A & BUNION: A | BXOR: (A | B) - (A & B)REVERSE_DIFFERENCE: B - AREPLACE: B
Проверка попадания (Hit Testing)
Вы можете проверить, находится ли точка или прямоугольник внутри региона.
if (region.contains(10, 10)) {
// Точка находится внутри
}
if (region.quickReject(new IRect(200, 200, 300, 300))) {
// Прямоугольник точно ВНЕ региона
}Использование с Canvas
Вы можете использовать Region для отсечения (clipping) на Canvas.
canvas.clipRegion(region);Примечание: Операции с Region (такие как setPath) строго основаны на целых числах. Кривые будут аппроксимированы небольшими шагами. Для высокоточного рендеринга предпочтительнее использовать Path. Region лучше всего подходит для сложной проверки попадания в UI или для пиксельно выровненных масок отсечения.