Эффективность при рисовании ImageView со скругленными углами

У меня есть подкласс ImageView, который я использую для рисования изображений с закругленными углами. Код основан на этом ответе и выглядит следующим образом:

public class ImageViewRoundedCorners extends ImageView {
   ...
    @Override
    protected void onDraw(Canvas canvas) {
        Bitmap scaledBitmap = Bitmap.createBitmap(getMeasuredWidth(),
                                                  getMeasuredHeight(),
                                                  Bitmap.Config.ARGB_8888); 
        Canvas scaledCanvas = new Canvas(scaledBitmap);
        super.onDraw(scaledCanvas); 
        drawRoundedCornerBitmap(canvas, scaledBitmap, 
                                getMeasuredWidth(), getMeasuredHeight());

        scaledBitmap.recycle();
    }

    protected void drawRoundedCornerBitmap(Canvas outputCanvas, Bitmap input, int w, int h) {
        Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        mPaint.reset();
        mPaint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);

        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawPath(mClipPath, mPaint);

        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(input, 0, 0, mPaint);

        outputCanvas.drawBitmap(output, 0, 0, null);
    }
}

С помощью этого кода изображение рисуется с правильно закругленными углами. Чтобы избежать выделения в первых двух строках drawRoundedCornerBitmap, я хочу рисовать непосредственно на outputCanvas, который является холстом, первоначально переданным на onDraw. Новая реализация выглядит так:

protected void drawRoundedCornerBitmap(...) {
    mPaint.reset();
    mPaint.setAntiAlias(true);
    outputCanvas.drawARGB(0, 0, 0, 0);

    mPaint.setStyle(Paint.Style.FILL);
    outputCanvas.drawPath(mClipPath, mPaint);

    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    outputCanvas.drawBitmap(input, 0, 0, mPaint);
}

По какой-то причине этот код игнорирует режим Porter -Duff и вместо этого просто рисует изображение с нормальными (не -закругленными )углами. Почему это так? Что такого в рисовании на промежуточном звене Bitmap, что заставляет исходный код работать?

6
задан Community 23 May 2017 в 12:28
поделиться