我们在使用ImageView时,不免需要显示图片为圆角矩形或者圆形的图片,在开发的过程中,使用最多的方法就是自定义控件

首先,自定义控件在Xml中定义时显得极不舒服,笔者就是这种感觉,

再者,自定义控件如果需要自定义属性的话,那么就需要在attr.xml中定义控件的属性,一个通用层控件一旦牵扯到res,就代表着他不能打成Jar,至少现在没有比较好的打包方法

所以笔者写了一个ImageView的工具类,而我们在为ImageView设置圆形图片时候,仅仅需要调用一句代码即可

ImageView image = (ImageView) findViewById(R.id.imageView1);
    image.setImageResource(R.drawable.img);
    //设置圆形图片
    ImageViewUtils.setCircle(image);

看一看效果图 :

而相应的ImageViewUtil这个工具类中,我们实现了对ImageView的改变,或许对于正宗自定义控件来讲,这是一个取巧折中的方法,我们直接上代码,笔者打了较详细的注释

public class ImageViewUtils {
    //设置圆角矩形
    public static void setRoundRect(ImageView image,int radius){
        //获得ImageView的Drawable并且将其装换为Bitmap
        Bitmap bitmap = drawableToBitmap(image.getDrawable());
        //这里是对Bitmap的一个重新绘制
        Bitmap newBitmap = makeRoundCorner(bitmap,radius);
        //重新设置image的ImageBitmap
        image.setImageBitmap(newBitmap);
    }
    //设置圆形图片
    //唯一的不同点是 bitmap的圆角半径由我们动态计算
    //圆角半径刚刚是获得的Bitmap宽度的一半
    //需要将ImageView设置为圆形,则宽度与高度必须相等,道理详细大家都懂
    public static void setCircle(ImageView image){
        //获得ImageView的Drawable并且将其装换为Bitmap
        Bitmap bitmap = drawableToBitmap(image.getDrawable());
        //这里是对Bitmap的一个重新绘制
        Bitmap newBitmap = makeRoundCorner(bitmap,bitmap.getWidth()/2);
        //重新设置image的ImageBitmap
        image.setImageBitmap(newBitmap);
    }
    //将Bitmap转换为圆角
    public static Bitmap makeRoundCorner(Bitmap bitmap, int px) 
    { 
        //获得Bitmap的宽高
        int width = bitmap.getWidth(); 
        int height = bitmap.getHeight(); 
        //创建需要返回的Bitmap
        Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
        //创建画板
        Canvas canvas = new Canvas(output); 
        int color = 0xff424242; 
        //创建画笔
        Paint paint = new Paint(); 
        //内部矩形
        Rect rect = new Rect(0, 0, width, height); 
        //外部矩形
        RectF rectF = new RectF(rect); 
        //消除锯齿
        paint.setAntiAlias(true); 
        canvas.drawARGB(0, 0, 0, 0); 
        paint.setColor(color); 
        //画出圆角矩形
        canvas.drawRoundRect(rectF, px, px, paint); 
        //设置画笔的Xfermode SRC_IN 意思就是先绘制的圆角矩形和后绘制的Bitmap取相交部分
        //且只留下SRC,也就是后绘制部分
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
        //绘制Bitmap
        canvas.drawBitmap(bitmap, rect, rect, paint); 
        return output; 
    }
    //Drawable => Bitmap
    public static Bitmap drawableToBitmap(Drawable drawable) {
        //将从ImageView中获得的Drawable转换为Bitmap
        Bitmap bitmap = Bitmap.createBitmap(
                drawable.getIntrinsicWidth(),
                drawable.getIntrinsicHeight(),
                drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        drawable.draw(canvas);
        return bitmap;
    }
}

代码并没有多难,大家希望通用的话可以打成Jar包引入项目中使用 希望会帮到你