圆形ImageView——头像显示

来源:互联网 发布:淘宝便宜有趣的小玩意 编辑:程序博客网 时间:2024/06/07 09:05

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

**这幅图可以明显看出图片压缩变形**

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

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

为了优化达到下图效果

**这幅图就达到我们所需得效果**

在上述代码中加入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

0 0
原创粉丝点击