2012-08-09 20 views
6

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?

+0

yo también tengo el mismo problema. –

+0

¿Encontraste alguna solución para esto? Incluso estoy intentando lo mismo :( –

Respuesta

0

Crear un dibujante Romain Guy ha hecho esto por usted. No somos una fábrica de enlaces, pero su publicación en el blog lo explica ampliamente y proporciona una forma eficiente de hacerlo. Rounded Corners

El principio básico de bienes, es crear un BitmapShader y adjuntarlo a un objeto Paint que atrae a una costumbre Drawable de esa manera sólo se aplican a la que DrawableImageView.

El uso de un dibujo indica que la imagen solo se pintó en un lienzo una vez, lo que significa que dibujar la imagen solo se realiza una vez, y entonces todo lo que hace ImageView es escalar el dibujo.

+0

¿No es esto un problema cuando tienes que escalar ese dibujable en el imageView? El dibujante se crea, luego se estira o se recorta, lo que significa que tus esquinas se verán raras, no? – secureboot

+0

Recuerda que 'ImageView' convierte lo que pases en' Drawable', proporciona su tamaño y luego llama a 'draw()' en 'Drawable'. De forma predeterminada si usted tenía un mapa de bits dibujable, por supuesto, solo lo estira, al pasar un 'RoundedBitmapDrawable' per-se, se dibujará en función de esa implementación. –