2016-03-27 5 views
1

La documentation ci-dessus semble indiquer que si vous invalidez plusieurs régions d'un View (en utilisant invalidate(l,t,r,b)), il n'est pas nécessaire de spécifier ces régions en utilisant la région de clip dans la méthode onDraw(). D'autre part, j'ai vu de nombreux exemples de vues personnalisées, qui maintiennent une région sale en parallèle à l'invalidation de la région, puis utilisent la région sale pour découper le canevas dans la méthode onDraw() (voir par exemple, the KeyBoardView class)La région du clip doit-elle être définie explicitement après invalider (l, t, r, b)?

la documentation est incomplète sur cette question? Est-ce que invalidate() et clipRect() devraient être utilisés de pair?

Répondre

0

Il n'y a pas d'obligation d'utiliser invalidate() en même temps que clipRect(). Il y a des moments où vous pouvez les utiliser indépendamment, et des moments où vous pouvez les utiliser ensemble.

Être une méthode sur View, invalide() fonctionne au niveau de l'ensemble de vue. L'invalidation d'une région comme celle-ci oblige Android à redessiner uniquement la région qui a été invalidée, ce qui fait que vous poussez moins de pixels à la suite d'un changement.

étant une méthode sur toile, clipRect() modifie l'espace de dessin efficace pour les opérations d'étirage ultérieures sur cette toile. Cela vous permet d'effectuer des opérations de dessin sans avoir à ajuster les calculs pour affecter uniquement cet espace limité. Le Canvas s'assurera que si vous dessinez en dehors de cet espace, cela n'aura aucun effet. Vous pouvez également accumuler des régions de plan pour créer des régions de plan non rectangulaires.

Une toile ne doit pas être associée à une vue. Plusieurs fois, vous voulez simplement dessiner dans un bitmap pour une utilisation ultérieure. Ainsi, l'utilisation de clipRect() sur un Canvas peut ou non avoir quelque chose à voir avec une View, et même alors, peut ou ne peut avoir rien à voir avec une invalidation sur cette vue. Si vous voulez utiliser les deux ensemble comme une optimisation pour les très grands espaces de dessin, vous devrez vous assurer que la région invalidée de la vue est équivalente à la région découpée du Canvas, ce qui n'est pas toujours simple étant donné que les régions de clip sont pas toujours des rectangles simples.

+1

La partie Canvas est clair pour moi. L'explication d'invalider pas tellement. Vous dites 'invalider (...)' amène Android à redessiner juste une région. Comment est-il fait? Comment puis-je savoir, depuis 'onDraw()' quelles sont les régions invalidées à dessiner? Ou devrais-je coder pour dessiner l'ensemble de la vue et android va simplement dessiner les régions invalidées? (qui ressemble beaucoup à 'clipRect()') – ilomambo