2010-07-26 5 views
32
public class POCII extends Activity { 

    myView mv = new myView(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(mv); 
    } 
} 


class myView extends View { 

    public myView(Context context) { 
     super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     Paint paint = new Paint(); 

     canvas.drawRect(0,0,100,100, paint); 
     canvas.clipRect(0,0,50,50); 
    } 
} 

Ma question est la suivante: le code ci-dessus ne doit-il pas dessiner un rectangle, puis rogner la partie supérieure gauche? Le rectangle n'est pas recadré.Utilisation de clipRect - explication

S'il vous plaît expliquer ce que fait clipRect. Qu'est-ce que c'est réellement l'écrêtage? Est-ce qu'il se clipse sous la forme d'un rectangle, compte tenu des coordonnées? Si oui, pourquoi le code ci-dessus ne fonctionne pas?

+2

http://youtu.be/vkTn3Ule4Ps?list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu –

Répondre

66

Toile. clipRect(left, top, right, bottom) réduit la zone de l'écran à laquelle les futures opérations de dessin peuvent écrire. Elle définit le clipBounds comme étant l'intersection spatiale du rectangle de découpage actuel et du rectangle spécifié. Il y a beaucoup de variantes de la méthode de clipRect qui acceptent différentes formes pour les régions et permettent différentes opérations sur le rectangle de découpage. Si vous voulez définir explicitement la zone de découpage, essayez:

canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE); 

Le 5e argument de moyens remplacer le rectangle de découpage plutôt que de créer l'intersection avec la version précédente.

Essayez de déplacer l'instruction clipRect avant l'instruction drawRect. Ou, essayez d'ajouter:

paint.setColor(Color.YELLOW); 
drawRect(0,0,75,75); 

après votre instruction clipRect existante. Il devrait dessiner un carré jaune de 50x50 sur ce que vous aviez avant.

Une autre note: (après une longue frustration avec le code View/ViewGroup/drawing en apparence non documenté), j'ai trouvé que canvas.translate (x, y) ajuste également le clipRect. L'interaction de clipRect et la matrice de dessin est très confuse. Il est utile d'imprimer:

canvas.getMatrix() 

et

canvas.getClipBounds() 

avant et après modification de la toile et avant de tirer les choses.

+2

La note sur canvas.translate (x, y) déconner avec le clipRect était très utile. M'a sauvé beaucoup de frustration. Merci! –

+0

Les méthodes avec 'Region.Op' sont apparemment maintenant dépréciée. – Suragch

+0

Comment obtenir la toile originale de la toile coupée? –

3

Pour rogner la partie supérieure gauche, faites:

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE); 
// secondly... 
canvas.drawRect(0,0,100,100, paint); 
4

ICS et plus ...

modes XOR, différence et clip ReverseDifference sont ignorés par ICS si l'accélération matérielle est activée.

Il suffit de désactiver l'accélération matérielle 2D dans votre vue:

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

check Référence Android: Howto use clipRect in API15