setShadowLayer Android API differences

Al_th picture Al_th · Jul 1, 2013 · Viewed 37.9k times · Source

I develop a custom view component for my application and I am struggling with adding a shadow to a circle.

Here is the code of my class extending 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);
    }
}

However, I noticed that depending on the API, There is a big impact on the shadowLayer.

Here is the output with

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

enter image description here

And here is the output with

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

enter image description here

Any idea how to overcome this unwanted behaviour ?

Best regards

Answer

Romain Guy picture Romain Guy · Jul 2, 2013

setShadowLayer() is only supported on text when hardware acceleration is on. Hardware acceleration is on by default when targetSdk=14 or higher. An easy workaround is to put your View in a software layer: myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null).