2015-04-05 3 views
2

J'ai lu plus de 20 questions/réponses mais je n'arrive toujours pas à obtenir ce que je veux. Je veux couper un cercle à l'intérieur d'un rectangle comme on le voit ci-dessous:Comment faire pour tracer un chemin circulaire à l'intérieur d'un rectangle dans Android

enter image description here

Voici mon code:

@Override 
protected void onDraw(Canvas canvas) { 
    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.FILL); 
    paint.setARGB(180, 0, 0, 0); 
    canvas.drawRect(0, 0, getWidth(), getHeight(), paint); 
    Path circularPath = new Path(); 
    circularPath.addCircle(getWidth()/2, getHeight()/2, radius, Path.Direction.CCW); 
    canvas.clipPath(circularPath, Region.Op.REPLACE); 
    canvas.drawColor(0x00000000); 


} 

Mon arrière-plan (setARGB) affiche correctement, mais rien est clipsé. J'ai également essayé différentes valeurs Op autres que REPLACE, rastérisation forcée de logiciel (comme je l'ai lu sur certaines versions Android clipPath ne supporte pas certains des Op) en appelant setLayerType(LAYER_TYPE_SOFTWARE, null); sur le constructeur, mais sans succès. Comment puis-je obtenir l'effet désiré?

Note: Ma version minimum SDK est 15, donc je ne pas besoin de soutenir quoi que ce soit inférieur à 4,0.

+0

avez-vous essayé Region.Op.DIFFERENCE? – pskink

+0

@pskink oui, juste essayé maintenant encore pour s'assurer. Malheureusement, rien ne se passe. –

+0

DIFFERENCE fonctionne bien pour moi, essayez de canvas.drawColor avec Color.RED, puis clipPath puis drawColor 0x88000000 – pskink

Répondre

1

Essayez clipping votre chemin dispatchDraw():

@Override 
protected void dispatchDraw(Canvas canvas) 
{ 
    canvas.clipPath(mClipPath, mRegion); // previously created path & region 

    super.dispatchDraw(canvas); 
} 

Supprimer le code Coupure, sentier de votre méthode onDraw, et qui devrait le faire.

Edit:

Lorsque vous créez votre chemin, assurez-vous que vous le faites seulement après une mesure a eu lieu, par exemple:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    mClipPath.reset(); 
    float radius = Math.min((float)getMeasuredWidth()/2f, (float)getMeasuredHeight()/2f) + 5; 
    mClipPath.addCircle((float)getMeasuredWidth()/2f, (float)getMeasuredHeight()/2f, radius, Path.Direction.CCW); 
} 
+0

J'ai essayé, rien n'a changé. –

+0

J'ai édité ma réponse pour inclure une cause possible de pourquoi cela ne fonctionne pas pour vous –

+2

Copiez/collez-le. Toujours pas de changement. Je doute fortement qu'il devrait y avoir une méthode surchargée autre que 'onDraw', car tous les exemples que j'ai vus impliquent seulement cette méthode. –