Search code examples
androidandroid-canvashardware-acceleration

Work around Canvas.clipPath() that is not supported in android any more


From android 3.0 the clipPath() method is no longer supported in devices with hardware acceleration turned on.(Read this article for more details).

I am working with canvas and I need to draw rounded image. Any ideas about how can I do that?

*I can't turn the hardware acceleration off, I am looking for other solution.

Answered: Tnx @Malcolm for your answer. I found a good example that demonstrate this technique, it's basically a mask.


Solution

  • Canvas.clipPath() support with hardware acceleration has been reintroduced since API 18.

    The best way to work around the problem is calling setLayerType(View.LAYER_TYPE_SOFTWARE, null) only when you are running on API from 11 to 17:

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2
            && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        setLayerType(LAYER_TYPE_SOFTWARE, null);
    }
    

    I also surrounded the clipPath() call with a try-catch block to avoid unpredicted app crashes:

    if (doClip) {
        try {
            canvas.clipPath(clipPath);
        } catch (UnsupportedOperationException e) {
            Log.e(TAG, "clipPath() not supported");
            doClip = false;
        }
    }
    

    Anyway, UnsupportedOperationException should never be thrown on API >= 18.

    See Unsupported Drawing Operations