Tengo una subclase ImageView
que utilizo para dibujar imágenes con esquinas redondeadas. El código se basa en this answer, y es como sigue:Eficiencia al dibujar un ImageView con esquinas redondeadas
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);
}
}
Con este código, la imagen se dibuja con esquinas redondeadas correctamente. Para evitar las asignaciones en las dos primeras líneas de drawRoundedCornerBitmap
, quiero dibujar directamente en outputCanvas
, que es el lienzo originalmente pasado a onDraw
. La nueva implementación es el siguiente:
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);
}
Por alguna razón, este código parece ignorar el modo de Porter-Duff, y en su lugar sólo señala a la imagen con esquinas normales (no redondeados). ¿Por qué es este el caso? ¿Qué tiene que ver con dibujar un intermedio Bitmap
que hace que el código original funcione?
yo también tengo el mismo problema. –
¿Encontraste alguna solución para esto? Incluso estoy intentando lo mismo :( –