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

android, android-canvas, hardware-acceleration

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

Problem

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.

Original source

Related problems