圆形ImageView——头像显示

关于这个功能已经很多人总结过了,但又有或多或少得小问题

圆形ImageView——头像显示_第1张图片

这已经是很简介的代码了,但问题是非正方形图片会明显压缩变形

public Bitmap toRoundBitmap(Bitmap bitmap) {  
        //圆形图片宽高  
        int width = bitmap.getWidth();  
        int height = bitmap.getHeight();  
        //正方形的边长  
        int r = 0;  
        //取最短边做边长  
        if(width > height) {  
            r = height;  
        } else {  
            r = width;  
        }  
        //构建一个bitmap  
        Bitmap backgroundBmp = Bitmap.createBitmap(width,  
                 height, Config.ARGB_8888);  
        //new一个Canvas,在backgroundBmp上画图  
        Canvas canvas = new Canvas(backgroundBmp);  
        Paint paint = new Paint();  
        //设置边缘光滑,去掉锯齿  
        paint.setAntiAlias(true);  
        //宽高相等,即正方形  
        RectF rect = new RectF(0, 0, r, r);  
        //通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,  
        //且都等于r/2时,画出来的圆角矩形就是圆形  
        canvas.drawRoundRect(rect, r/2, r/2, paint);  
        //设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉  
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
        //canvas将bitmap画在backgroundBmp上  
        canvas.drawBitmap(bitmap, null, rect, paint);  
        //返回已经绘画好的backgroundBmp  
        return backgroundBmp;  
    }  

原文已经讲述的很详细了,多余不再赘述。

原文链接:http://blog.csdn.net/feixiangdexin123087/article/details/42076987

为了优化达到下图效果

圆形ImageView——头像显示_第2张图片

在上述代码中加入Bitmap剪切出正方形的功能:

    int r = width > height ? height : width;// 裁切后所取的正方形区域边长;
    int retX = width > height ? (width - height) / 2 : 0;//基于原图,取正方形左上角x坐标
    int retY = width > height ? 0 : (height - width) / 2;
    bitmap = Bitmap.createBitmap(bitmap, retX, retY, r, r, null, false);

最终代码如下:

public Bitmap toRoundBitmap(Bitmap bitmap) {
        //圆形图片宽高
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        //正方形的边长
        int r = width > height ? height : width;// 裁切后所取的正方形区域边长;
        int retX = width > height ? (width - height) / 2 : 0;//基于原图,取正方形左上角x坐标
        int retY = width > height ? 0 : (height - width) / 2;
        bitmap = Bitmap.createBitmap(bitmap, retX, retY, r, r, null, false);
        //构建一个bitmap
        Bitmap backgroundBmp = Bitmap.createBitmap(width,
                height, Bitmap.Config.ARGB_8888);
        //new一个Canvas,在backgroundBmp上画图
        Canvas canvas = new Canvas(backgroundBmp);
        Paint paint = new Paint();
        //设置边缘光滑,去掉锯齿
        paint.setAntiAlias(true);
        //宽高相等,即正方形
        RectF rect = new RectF(0, 0, r, r);
        //通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,
        //且都等于r/2时,画出来的圆角矩形就是圆形
        canvas.drawRoundRect(rect, r/2, r/2, paint);
        //设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        //canvas将bitmap画在backgroundBmp上
        canvas.drawBitmap(bitmap, null, rect, paint);
        //返回已经绘画好的backgroundBmp
        return backgroundBmp;
    }

原文链接:http://www.cnblogs.com/Jessy/archive/2012/02/03/2336787.html

你可能感兴趣的:(Android,UI布局)