Recabamos en diferentes foros y así tenerte la respuesta a tu duda, en caso de dudas puedes dejarnos tu inquietud y contestamos porque estamos para ayudarte.
Solución:
Esto es bastante tarde en respuesta, pero para cualquier otra persona que esté buscando esto, puede hacer el siguiente código para redondear manualmente las esquinas de sus imágenes.
http://www.ruibm.com/?p=184
Este no es mi código, pero lo he usado y funciona maravillosamente. Lo usé como un ayudante dentro de una clase ImageHelper y lo amplié un poco para pasar la cantidad de difuminado que necesito para una imagen determinada.
El código final se ve así:
package com.company.app.utils;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
public class ImageHelper
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels)
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = pixels;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
¡Espero que esto ayude a alguien!
Otra manera fácil es usar un CardView con el radio de la esquina y un ImageView adentro:
Si bien la respuesta anterior funciona, Romain Guy (un desarrollador principal de Android) muestra un método mejor en su blog que usa menos memoria al usar un sombreador que no crea una copia del mapa de bits. La esencia general de la funcionalidad está aquí:
BitmapShader shader;
shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(shader);
RectF rect = new RectF(0.0f, 0.0f, width, height);
// rect contains the bounds of the shape
// radius is the radius in pixels of the rounded corners
// paint contains the shader that will texture the shape
canvas.drawRoundRect(rect, radius, radius, paint);
Las ventajas de esto sobre otros métodos es que:
- no crea una copia separada del mapa de bits, que usa mucha memoria con imágenes grandes [vs most of the other answers here]
- apoya antialisado [vs clipPath method]
- apoya alfa [vs xfermode+porterduff method]
- apoya aceleracion de hardware [vs clipPath method]
- solamente dibuja una vez en el lienzo [vs xfermode and clippath methods]
Creé un RoundedImageView basado en este código que envuelve esta lógica en un ImageView y agrega ScaleType
soporte y un borde redondeado opcional.