2017-06-09 4 views
0

J'utilise xamarin pour développer une application Android. Lorsque j'essaie d'utiliser la classe Region j'ai un problème, le code ci-dessous peut bien fonctionner et montrer une zone bleue attendue.Ne comprend pas très bien la classe de région

Rect rect1 = new Rect(0, 0, 10,10); 
canvas.ClipRect(rect1); 
Rect rect2 = new Rect(20, 20, 30,30); 
canvas.ClipRect(rect2, Region.Op.Union); 
canvas.DrawRect(0, 0, 40, 40, paint); 

Mais au-dessous du code ne fonctionne pas, il suffit rien montrer, un fond blanc

Region region = new Region(); 
Rect rect1 = new Rect(0, 0, 10,10); 
region.Union(rect1); 
Rect rect2 = new Rect(20, 20, 30,30); 
region.Union(rect2); 

canvas.ClipRegion(region); 
canvas.DrawRect(0, 0, 40, 40, paint); 

Je ne sais pas pourquoi.

Répondre

0

En fait cela fonctionne, mais il peut être bloqué par votre ActionBar ou quelque chose d'autre, donc vous ne pouvez pas le voir et vous pensez que cela ne fonctionne pas, comme this. Mais si vous modifiez les coordonnées, vous pouvez voir le rectangle que vous dessinez. Voici mon code et le résultat:

Region region = new Region(); 
Rect rect1 = new Rect(200, 200, 300, 300); 
region.Union(rect1); 
Rect rect2 = new Rect(400, 400, 500, 500); 
region.Union(rect2); 

Voici le document pour expliquer la méthode canvas.ClipRegion(region):

Intersect le clip en cours avec la région déterminée. Notez que contrairement à clipRect() et clipPath() qui transforment leurs arguments par la matrice courante, clipRegion() suppose que son argument est déjà dans le système de coordonnées du bitmap de la couche courante, et donc aucune transformation n'est effectuée.

EDIT:

Coordonnée pour clipRect(), coornadite pour clipRegion().

+0

Merci. J'ai changé mes coordonnées et les formes peuvent être affichées. Mais je ne suis pas d'accord avec votre explication. Si ActionBar ou quelque chose d'autre couvre ma forme et cause qu'il ne peut pas être vu dans le deuxième cas alors pourquoi ces formes peuvent être vues dans le premier cas? – Frank

+0

Notez que contrairement à clipRect() et clipPath() qui transforment leurs arguments par la matrice courante, signifie pour la méthode clipRect(), sa coordonnée est la matrice courante, l'espace dans lequel elle sera placée. Mais pour la méthode ClipRegion(), sa coordonnée est le bitmap de la couche en cours, l'écran du téléphone. Leur coordonnée est différente. –

+0

J'ai mis à jour ma réponse, veuillez la vérifier. :) –