我用的是一个RoundImageView.java自定义圆图组件:

public class RoundImageView extends ImageView {    private int mBorderThickness = 0;    private Context mContext;    private int defaultColor = 0xFFFFFFFF;    // 如果只有其中一个有值,则只画一个圆形边框    private int mBorderOutsideColor = 0;    private int mBorderInsideColor = 0;    // 控件默认长、宽    private int defaultWidth = 0;    private int defaultHeight = 0;    public RoundImageView(Context context) {        super(context);        mContext = context;    }    public RoundImageView(Context context, AttributeSet attrs) {        super(context, attrs);        mContext = context;        setCustomAttributes(attrs);    }    public RoundImageView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        mContext = context;        setCustomAttributes(attrs);    }    private void setCustomAttributes(AttributeSet attrs) {        // TypedArray a = mContext.obtainStyledAttributes(attrs,        // R.styleable.roundedimageview);        // mBorderThickness = a.getDimensionPixelSize(        // R.styleable.roundedimageview_border_thickness, 0);        // mBorderOutsideColor = a        // .getColor(R.styleable.roundedimageview_border_outside_color,        // defaultColor);        // mBorderInsideColor = a.getColor(        // R.styleable.roundedimageview_border_inside_color, defaultColor);    }    @SuppressLint("DrawAllocation")    @Override    protected void onDraw(Canvas canvas) {        Drawable drawable = getDrawable();        if (drawable == null) {            return;        }        if (getWidth() == 0 || getHeight() == 0) {            return;        }        this.measure(0, 0);        if (drawable.getClass() == NinePatchDrawable.class)            return;        Bitmap b = null;        if (drawable instanceof BitmapDrawable) {            b = ((BitmapDrawable) drawable).getBitmap();        } else if (drawable instanceof AsyncDrawable) {            //添加这个判断只为支持xutils            b = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),                    drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);            Canvas canvas1 = new Canvas(b);            // canvas.setBitmap(bitmap);            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());            drawable.draw(canvas1);        }        Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);        if (defaultWidth == 0) {            defaultWidth = getWidth();        }        if (defaultHeight == 0) {            defaultHeight = getHeight();        }        // 保证重新读取图片后不会因为图片大小而改变控件宽、        //高的大小(针对宽、高为wrap_content布局的imageview,但会导致margin无效)        int radius = 0;        // 定义画两个边框,分别为外圆边框和内圆边框        if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {            radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 * mBorderThickness;            // 画内圆            drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);            // 画外圆            drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor);        } else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {// 定义画一个边框            radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;            drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);        } else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {// 定义画一个边框            radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;            drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderOutsideColor);        } else {// 没有边框            radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2;        }        Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);        canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight / 2 - radius, null);    }    /** * 获取裁剪后的圆形图片 * @param radius 半径 */    public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {        Bitmap scaledSrcBmp;        int diameter = radius * 2;        // 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片        int bmpWidth = bmp.getWidth();        int bmpHeight = bmp.getHeight();        int squareWidth = 0, squareHeight = 0;        int x = 0, y = 0;        Bitmap squareBitmap;        if (bmpHeight > bmpWidth) {// 高大于宽            squareWidth = squareHeight = bmpWidth;            x = 0;            y = (bmpHeight - bmpWidth) / 2;            // 截取正方形图片            squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);        } else if (bmpHeight < bmpWidth) {// 宽大于高            squareWidth = squareHeight = bmpHeight;            x = (bmpWidth - bmpHeight) / 2;            y = 0;            squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);        } else {            squareBitmap = bmp;        }        if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() != diameter) {            scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter, diameter, true);        } else {            scaledSrcBmp = squareBitmap;        }        Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight(), Config.ARGB_8888);        Canvas canvas = new Canvas(output);        Paint paint = new Paint();        Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight());        paint.setAntiAlias(true);        paint.setFilterBitmap(true);        paint.setDither(true);        canvas.drawARGB(0, 0, 0, 0);        canvas.drawCircle(scaledSrcBmp.getWidth() / 2, scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2,                paint);        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));        canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);        // bitmap回收(recycle导致在布局文件XML看不到效果)        // bmp.recycle();        // squareBitmap.recycle();        // scaledSrcBmp.recycle();        bmp = null;        squareBitmap = null;        scaledSrcBmp = null;        return output;    }    /** * 边缘画圆 */    private void drawCircleBorder(Canvas canvas, int radius, int color) {        Paint paint = new Paint();        /* 去锯齿 */        paint.setAntiAlias(true);        paint.setFilterBitmap(true);        paint.setDither(true);        paint.setColor(color);        /* 设置paint的 style 为STROKE:空心 */        paint.setStyle(Paint.Style.STROKE);        /* 设置paint的外框宽度 */        paint.setStrokeWidth(mBorderThickness);        canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);    }}

如果使用xutils加载图片的朋友可能有的时候用上这种圆图处理会报异常

java.lang.Class Cast Exception: com.lidroid.xutils.bitmap.core.Async Drawable cannot be cast to android.graphics.drawable.BitmapDrawable

在其中加上这个判断就OK了

  if(drawable instanceof BitmapDrawable){          b =  ((BitmapDrawable)drawable).getBitmap() ;      }else if(drawable instanceof AsyncDrawable){          b = Bitmap                   .createBitmap(                   getWidth(),                   getHeight(),                   drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888                   : Bitmap.Config.RGB_565);                 Canvas canvas1 = new Canvas(b);                 // canvas.setBitmap(bitmap);                 drawable.setBounds(0, 0, getWidth(),                   getHeight());                 drawable.draw(canvas1);     }  

相关圆图组件还有很多:
https://github.com/vinc3m1/RoundedImageView
此组件 用于圆角。圆图,但不支持xutils显示

https://github.com/lopspower/CircularImageView
这个同样不支持xutils

https://github.com/hdodenhof/CircleImageView
这个也不错。同样不支持xutils

以上开源组件稍作修改便可支持xutils

更多相关文章

  1. 【Android】ScrollView内动态添加图片间距过大的问题
  2. android 背景图片的设置
  3. android skia 解析gif图片
  4. Android(安卓)平铺背景图片
  5. Android实现图片毛玻璃背景效果
  6. Android上图片压缩方式
  7. Android从相册选择一个图片、剪切、上传
  8. Android(安卓)ListView控件显示数据库中图片

随机推荐

  1. mysql语法之case when then与列转行
  2. Window7 环境下 MariaDB 的安装 及使用
  3. MySQL翻页查询技巧
  4. 请问MySql 可以处理8千万条以上的记录吗,
  5. mysql启动脚本——指定数据目录并指定配
  6. PHP OOP和MySQLi连接=致命错误:调用未定
  7. InnoDB瓶颈:放宽ACID以提高性能
  8. Hive安装与部署集成mysql
  9. 0926MySQL中ICP索引下推
  10. 【转载】----CentOS 6.5下安装MySQL 5.6.