web-dev-qa-db-fra.com

Utilisation de clipRect - explication

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 devrait-il pas dessiner un rectangle, puis recadrer la partie supérieure gauche? Le rectangle ne se recadre pas.

Veuillez expliquer ce que clipRect fait. De quoi s'agit-il réellement? Se clipse-t-il sous la forme d'un rectangle, compte tenu des coordonnées? Si oui, pourquoi le code ci-dessus ne fonctionne-t-il pas?

40
Namratha

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

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

Le 5ème argument signifie 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 50x50 sur ce que vous aviez auparavant.

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

canvas.getMatrix()

et

canvas.getClipBounds()

avant et après les modifications de la toile et avant de dessiner des choses.

79
Ribo

Pour recadrer la partie supérieure gauche, procédez comme suit:

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE);
// secondly...
canvas.drawRect(0,0,100,100, Paint); 
5
Matt Hansen

ICS et au-dessus ...

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

Désactivez simplement l'accélération matérielle 2D dans votre vue:

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

Référence Android: Comment utiliser clipRect dans API15

4
SHS

votre dessin ressemble à ceci sans utiliser cliprect:

enter image description here

maintenant, si nous utilisons un cliprect, nous mettons une superposition d'un rectangle sur ce que nous avons déjà. son genre d'invisible. disons que nous avons appelé ce qui suit:

 override fun onDraw(canvas: Canvas) {

        val Paint =  Paint();
        Paint.color = Color.RED
        canvas.clipRect(0f,0f,500f,500f, Region.Op.DIFFERENCE);
// secondly...
        canvas.drawRect(0f,0f,1000f,1000f, Paint);
    }

puisque nous utilisons l'option DIFFERENCE et que nous savons que le rectangle de détourage est maintenant SUR notre rectangle rouge de toile, nous pouvons me dire des choses spéciales. ci-dessus dit que nous devons GARDER la DIFFÉRENCE entre le rectangle de détourage et l'original. cela ressemblera à ceci (puisque j'ai utilisé la moitié de 1000 pour découper le rectangle):

enter image description here

et le opposé si nous avons utilisé l'intersection ressemblerait à ceci: enter image description here

j'aimerais voir si quelqu'un peut le faire faire des coins arrondis.

0
j2emanue