web-dev-qa-db-fra.com

setShadowLayer Android différences API

Je développe un composant d'affichage personnalisé pour mon application et j'ai du mal à ajouter une ombre à un cercle.

Voici le code de ma classe étendant View

public class ChartView extends View {


    public ChartView(Context context, AttributeSet attributeSet){
        super(context, attributeSet);
        init();


    }
    Paint paint;
    public void init(){
        Paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        Paint.setColor(Color.WHITE);
        Paint.setStyle(Paint.Style.FILL);
        Paint.setShadowLayer(30, 0, 0, Color.RED);

    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawCircle(getWidth()/2, getHeight()/2,50, Paint);
    }
}

Cependant, j'ai remarqué qu'en fonction de l'API, il y a un grand impact sur le shadowLayer.

Voici la sortie avec

<uses-sdk Android:targetSdkVersion="13"/>

enter image description here

Et voici la sortie avec

<uses-sdk Android:targetSdkVersion="14"/> //Higher target API yields the same output.

enter image description here

Une idée de comment surmonter ce comportement indésirable?

Meilleures salutations

31
Al_th

setShadowLayer() n'est pris en charge sur le texte que lorsque l'accélération matérielle est activée. L'accélération matérielle est activée par défaut lorsque targetSdk=14 Ou supérieur. Une solution simple consiste à placer votre vue dans une couche logicielle: myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null).

71
Romain Guy