Référence API : Region
La classe Region représente une zone complexe sur le canevas, similaire à un Path, mais définie par des coordonnées entières. Les régions sont hautement optimisées pour les opérations booléennes (comme l'intersection, l'union, la différence) et pour tester si un point ou un rectangle est à l'intérieur de la zone.
Vue d'ensemble
Contrairement à Path, qui utilise des coordonnées à virgule flottante et peut contenir des courbes, une Region est fondamentalement une collection de lignes de balayage horizontales. Elle est efficace pour les tests de collision et le découpage.
Création et modification de régions
// Créer une région vide
Region region = new Region();
// La définir comme un rectangle
region.setRect(new IRect(0, 0, 100, 100));
// La définir à partir d'un Path
// (Nécessite une région de 'clip' pour définir les limites maximales)
Path path = new Path().addCircle(50, 50, 40);
Region clip = new Region();
clip.setRect(new IRect(0, 0, 200, 200));
region.setPath(path, clip);Opérations booléennes
La puissance de Region réside dans sa capacité à combiner plusieurs zones à l'aide d'opérateurs logiques.
Region regionA = new Region();
regionA.setRect(new IRect(0, 0, 100, 100));
Region regionB = new Region();
regionB.setRect(new IRect(50, 50, 150, 150));
// Intersection : Le résultat est la zone de chevauchement (50, 50, 100, 100)
regionA.op(regionB, RegionOp.INTERSECT);
// Union : Le résultat est la zone combinée des deux
regionA.op(regionB, RegionOp.UNION);
// Différence : Retirer B de A
regionA.op(regionB, RegionOp.DIFFERENCE);Opérations disponibles (RegionOp) :
DIFFERENCE: A - BINTERSECT: A & BUNION: A | BXOR: (A | B) - (A & B)REVERSE_DIFFERENCE: B - AREPLACE: B
Test de collision
Vous pouvez vérifier si un point ou un rectangle est à l'intérieur d'une région.
if (region.contains(10, 10)) {
// Le point est à l'intérieur
}
if (region.quickReject(new IRect(200, 200, 300, 300))) {
// Le rectangle est définitivement À L'EXTÉRIEUR de la région
}Utilisation avec Canvas
Vous pouvez utiliser une Region pour découper le Canvas.
canvas.clipRegion(region);Note : Les opérations sur Region (comme setPath) sont strictement basées sur des entiers. Les courbes seront approximées par de petits pas. Pour un rendu de haute précision, préférez Path. Region est idéale pour les tests de collision d'interface utilisateur complexes ou les masques de découpage alignés sur les pixels.