2012-09-11 2 views
2

J'essaie de dessiner un anneau avec une bordure d'ombre noire. Je peux réaliser ceci avec la vue faite sur commande quand j'utilise n'importe quelle couleur comme RED, mais ce que je veux est un cercle transparent avec la frontière d'ombre noire.Dessiner une bague avec une ombre noire

Paint mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setColor(Color.RED); 
    mPaint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK); 

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawCircle(70, 70, 50, mPaint); } 
+0

Les couleurs utilisent des valeurs ARGB avec A étant une opacité. Au lieu d'utiliser 'setColor (Colour.RED)' pour 'mPaint', avez-vous essayé' setColor (0x00000000) '? – Squonk

+0

Quelque chose de complètement transparent n'aurait pas d'ombre par définition? – Geobits

+0

@Squonk Il remplit le cercle avec la couleur noire Je veux qu'il soit transparent. – mkso

Répondre

3

Ce qui se passe ici est qu'il dessine un rempli cercle transparent, et le réglage de la couche d'ombre à cela. Puisque le cercle est transparent, vous voyez toute l'ombre de l'objet à travers, pas seulement les bords que vous recherchez. L'ombre est noire, donc il semble que tout le cercle soit noir. Essayez de définir le style de peinture sur Stroke. Cela devrait laisser le milieu transparent et dessiner l'ombre de l'anneau extérieur. Cependant, il peut dessiner l'ombre dans les deux directions (intérieure et extérieure), vous devrez donc ajuster le rayon de l'ombre en conséquence.

mPaint.setStyle(Paint.Style.STROKE); 
+0

Je n'ai toujours pas le même résultat que jsfiddle.net/JHjQ4 – mkso

+0

Existe-t-il un moyen de dessiner l'ombre seulement sur l'extérieur sans avoir à ajuster le rayon? – Pkmmte

0

Souhaitez-vous Android SDK 11 ou supérieur? Comme le rendu d'ombre HoneyComb avec le support matériel a été désactivé, vous devez activer le rendu logiciel pour cette couche. Vous devez annoter votre fonction pour la mise en place de la peinture comme ceci:

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
private void setUpPaint(){ 
    mPaint.setAntiAlias(true); 
    mPaint.setColor(Color.RED); 
    mPaint.setShadowLayer(5.5f, 6.0f, 6.0f, 0x80000000); 

    /* --- for android:minSdkVersion="11" --- */ 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    setLayerType(LAYER_TYPE_SOFTWARE, mPaint); 
} 
} 
0

Vous aurez besoin de tirer efficacement l'ombre en utilisant une couleur totalement transparente, comme vous l'avez trouvé jusqu'à présent, puis retirez ce centre de couleur à l'aide PorterDuff.Mode.CLEAR - laissant juste l'ombre à l'extérieur.

PorterDuffXfermode mXferMode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR); 

// draw the src/dst example into our offscreen bitmap 
int sc = canvas.saveLayer(0, 0, 70 + 50, 70 + 50, null, 
             Canvas.MATRIX_SAVE_FLAG | 
             Canvas.CLIP_SAVE_FLAG | 
             Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | 
             Canvas.FULL_COLOR_LAYER_SAVE_FLAG | 
             Canvas.CLIP_TO_LAYER_SAVE_FLAG); 

canvas.drawCircle(70, 70, 50, shadowPaint); 
shadowPaint.setXfermode(mXferMode); 
canvas.drawCircle(70, 70, 50, shadowPaint); 
shadowPaint.setXfermode(null); 
canvas.restoreToCount(sc); 
Questions connexes