2011-05-23 13 views
0

J'écris une coutume View, mais je ne peux pas vraiment comprendre comment utiliser clipRect sur un Canvas. J'ai besoin parce que je vous appelle draw(Canvas) sur un autre objet, et je voudrais donner mon (rognée) Canvas. Ma solution actuelle est:Comment utiliser correctement clipRect?

StaticLayout sl = new StaticLayout(text, tp, (int) (rect.right - rect.left), Alignment.ALIGN_NORMAL, 1f, 0f, true); 

Bitmap layoutBitmap = Bitmap.createBitmap((int) (rect.right - rect.left), (int) (rect.bottom - rect.top), Config.ARGB_8888); 
Canvas layoutCanvas = new Canvas(layoutBitmap); 
sl.draw(layoutCanvas); 

canvas.drawBitmap(layoutBitmap, null, rect, null); 

Cependant, cela se sent sale, la création d'une nouvelle image et une nouvelle toile à chaque fois (j'utilise cette méthode pour dessiner le texte dans une boîte, voir my previous question).

Ce que je voudrais faire est quelque chose comme ceci:

StaticLayout sl = new StaticLayout(text, tp, (int) (rect.right - rect.left), Alignment.ALIGN_NORMAL, 1f, 0f, true); 

canvas.save(); 
canvas.clipRect(rect, Region.Op.REPLACE); 
sl.draw(canvas); 
canvas.restore(); 

Ce « sent » bien mieux, sauf que cela ne fonctionne pas. Est-ce que j'utilise clipRect incorrect? Est-ce que je ne comprends pas ce que c'est réellement ou comment l'utiliser? S'il vous plaît donnez votre avis.

P.S. Ma compréhension de clipRect est que, après cet appel clipRect, 0, 0 devrait effectivement se traduire par rect.left, rect.top.

Répondre

0

Après un peu d'expérimentation, il semble que clipRect restreint que le dessin à la donnée rect, de sorte que tout tirage appels en dehors de cette rect sera clipsé à cette rect. Ainsi, ma compréhension de clipRect était erronée.

Cela signifie que, pour pouvoir utiliser StaticLayout je dois d'abord dessiner un Bitmap qui est la taille de mon rect puis piochez Bitmap à mon Canvas aux coordonnées dont j'ai besoin.

Cependant, j'ai eu recours à l'utilisation de la place Canvas.drawText et TextPaint.breakText (donc je ne pas créer un Bitmap à chaque fois).