2010-10-26 28 views
19

Je suis en train de porter une application écrite dans un environnement graphique qui permet de dessiner en dehors des limites du rectangle de découpage. Un moyen de le faire dans Android?Puis-je dessiner hors des limites d'un canevas Android?

+1

Nous avons aucune idée de ce que vous parlez avec un exemple et certains code – Falmarri

Répondre

8

Vous pouvez dessiner où vous voulez, mais rien ne sera sauvegardé en dehors du rectangle de découpage.

40

Pour dessiner en dehors des limites, vous devez développer le clipRect du canevas.

Consultez les méthodes surchargées clipRect sur la classe Canvas.

Remarque - Vous devez spécifier l'opération de région car l'opération par défaut est INTERSECT. Donc, quelque chose comme ceci:

Rect newRect = canvas.getClipBounds(); 
newRect.inset(-5, -5) //make the rect larger 

canvas.clipRect (newRect, Region.Op.REPLACE); 
//happily draw outside the bound now 
+1

Ça ne marche pas du tout. Je redimensionne simplement le canvas avec les paramètres (-2000, -2000), puis je le traduis mais l'image que je dessine est toujours découpée. – tomrozb

+1

a travaillé pour moi. +1 – dac2009

+0

mais si vous faites cela sur chaque 'onDraw (Canvas canvas)' alors ne faites-vous pas beaucoup de travail supplémentaire? –

28

essayer de mettre

android:clipChildren="false" 

à la vue parent

+0

Je ne connais pas la question mais je veux vous remercier pour la résolution de mon problème auquel je faisais face. Je vous remercie. C'est ce que je cherchais. – tannerjohn

+0

S'il vous plaît jeter un oeil à http://stackoverflow.com/questions/32735119/draw-outside-the-bounds-of-an-android-canvas –

+0

@MortezaRastgoo la question liée (et les réponses) ne se traduisent pas directement à ce problème du tout. –

1

Le @numan réponse a presque ok, le problème est l'allocation de mémoire avec cette approche, donc nous devrait faire cela, au lieu:

// in constructor/elsewhere 
Rect newRect = new Rect(); 

// in onDraw 
canvas.getClipBounds(newRect); 
newRect.inset(0, -20); //make the rect larger 
canvas.clipRect(newRect, Region.Op.REPLACE); 

qui résout le problème :-)

+0

Comment initier 'newRect'? –

+1

Ok, je suppose que le point ici que newRect est alloué une fois par objet init, au lieu de l'allouer chaque fois que onDraw est appelé. –

+0

J'ai essayé ça, mais ça n'a pas marché. –

0

Si vous voulez dessiner le texte en dehors des limites dans TextView, vous devez faire ceci:

<TextView 
    ... 
    android:shadowColor="#01000000" 
    android:shadowDx="100" // out of right bound 
    android:shadowDy="0" 
    android:shadowRadius="1" 
.../> 

Il ne fonctionne pas à utiliser clipRect() comme la réponse de @ Numan parce TextView clip, il est propre rect dans onDraw():

if (mShadowRadius != 0) { 
    clipLeft += Math.min(0, mShadowDx - mShadowRadius); 
    clipRight += Math.max(0, mShadowDx + mShadowRadius); 

    clipTop += Math.min(0, mShadowDy - mShadowRadius); 
    clipBottom += Math.max(0, mShadowDy + mShadowRadius); 
} 

canvas.clipRect(clipLeft, clipTop, clipRight, clipBottom); 

Last but not least, ne pas oublier de mettre android:clipChildren="false" et android:clipToPadding="false" dans votre parent ViewGroup