1. 程式人生 > >android實現圖片圓角化實現三種方法

android實現圖片圓角化實現三種方法

方法一

自定義ImageView

/**
 * 自定義的圓角矩形ImageView,可以直接當元件在佈局中使用。
 * @author caizhiming
 *
 */
public class XCRoundRectImageView extends ImageView {

    private Paint paint;
    public XCRoundRectImageView(Context context) {
        this(context,null);
}

    public XCRoundRectImageView(Context context, AttributeSet attrs) {
        this
(context, attrs,0); } public XCRoundRectImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); paint = new Paint(); } /** * 繪製圓角矩形圖片 * @author caizhiming */ @Override protected void onDraw(Canvas canvas) { // Drawable drawable = getDrawable();
if (null != drawable) { Bitmap bitmap = getBitmapFromDrawable(drawable); // Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); Bitmap b = getRoundBitmap(bitmap, 20); final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight()); final Rect rectDest = new
Rect(0,0,getWidth(),getHeight()); paint.reset(); canvas.drawBitmap(b, rectSrc, rectDest, paint); } else { super.onDraw(canvas); } } /** * 獲取圓角矩形圖片方法 * @param bitmap * @param roundPx,一般設定成14 * @return Bitmap * @author caizhiming */ private Bitmap getRoundBitmap(Bitmap bitmap, int roundPx) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); int x = bitmap.getWidth(); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } }
/**
 * 把資源圖片轉換成Bitmap
 *
 * @param drawable
*            資源圖片
 * @return 點陣圖
 */
public static Bitmap getBitmapFromDrawable(Drawable drawable) {
   int width = drawable.getIntrinsicWidth();
   int height = drawable.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
         .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(-4, -4, width+4, height+4);
drawable.draw(canvas);
   return bitmap;
}

方法二用Glide載入顯示圖片
Glide.with(mContext).load(mList.get(position).getImgUrl()).thumbnail(0.1f)
        .error(R.drawable.icon)
        .transform(new GlideRoundTransform(mContext,10))//設定弧度
        .into(holder.imageview);

public class GlideRoundTransform extends BitmapTransformation {

    private static float radius = 0f;
    public GlideRoundTransform(Context context) {
        this(context, 4);
}

    public GlideRoundTransform(Context context, int dp) {
        super(context);
        this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
}

    @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return roundCrop(pool, toTransform);
}

    private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}

        Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
        return result;
}

    @Override public String getId() {
        return getClass().getName() + Math.round(radius);
}

方法三

/** */
/**
 * 把圖片變成圓角
 *
 * @param bitmap
*            需要修改的圖片
 * @param pixels
*            圓角的弧度
 * @return 圓角圖片
 */
public static Bitmap toRoundCorner(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;
}