【Android】自定义圆形ImageView(圆形头像 可指定大小)

来源:互联网 发布:网络授课平台哪个好 编辑:程序博客网 时间:2024/05/17 11:07

     最近在仿手Q的UI,这里面经常要用到的就是圆形头像,看到 在android中画圆形图片的几种办法 这篇文章,了解了制作这种头像的原理.不过里面提供的方法还有一个不足的地方就是不能根据实际需求改变图片的大小,也就是说提供的原图是大尺寸的,转换之后的图片也是大尺寸的,这显然不符合我们实际项目中的需求.于是我对里面介绍的第一种方法做了一番改进,使其能直接在XML中指定图片的大小.

大体步骤

  1. 将原图居中裁剪成正方形
  2. 根据指定的宽度对正方形进行缩放
  3. 裁剪成圆形
首先是java代码:

package com.zdsoft.blp.zidingyikongjian;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.widget.ImageView;/** * Created by Administrator on 2017/4/22. */public class AvatarImageView extends ImageView {    private Paint paint = new Paint();    public AvatarImageView(Context context) {        super(context);    }    public AvatarImageView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public AvatarImageView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    //将头像按比例缩放    private Bitmap scaleBitmap(Bitmap bitmap) {        int width = getWidth();        //一定要强转成float 不然有可能因为精度不够 出现 scale0 的错误        float scale = (float) width / (float) bitmap.getWidth();        Matrix matrix = new Matrix();        matrix.postScale(scale, scale);        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);    }    //将原始图像裁剪成正方形    private Bitmap dealRawBitmap(Bitmap bitmap) {        int width = bitmap.getWidth();        int height = bitmap.getHeight();        //获取宽度        int minWidth = width > height ? height : width;        //计算正方形的范围        int leftTopX = (width - minWidth) / 2;        int leftTopY = (height - minWidth) / 2;        //裁剪成正方形        Bitmap newBitmap = Bitmap.createBitmap(bitmap, leftTopX, leftTopY, minWidth, minWidth, null, false);        return scaleBitmap(newBitmap);    }    @Override    protected void onDraw(Canvas canvas) {        Drawable drawable = getDrawable();        if (null != drawable) {            Bitmap rawBitmap = ((BitmapDrawable) drawable).getBitmap();            //处理Bitmap 转成正方形            Bitmap newBitmap = dealRawBitmap(rawBitmap);            //newBitmap 转换成圆形            Bitmap circleBitmap = toRoundCorner(newBitmap, 14);            final Rect rect = new Rect(0, 0, circleBitmap.getWidth(), circleBitmap.getHeight());            paint.reset();            //绘制到画布上            canvas.drawBitmap(circleBitmap, rect, rect, paint);        } else {            super.onDraw(canvas);        }    }    private Bitmap toRoundCorner(Bitmap bitmap, int pixels) {        //指定为 ARGB_4444 可以减小图片大小        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_4444);        Canvas canvas = new Canvas(output);        final int color = 0xff424242;        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());        paint.setAntiAlias(true);        canvas.drawARGB(0, 0, 0, 0);        paint.setColor(color);        int x = bitmap.getWidth();        canvas.drawCircle(x / 2, x / 2, x / 2, paint);        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));        canvas.drawBitmap(bitmap, rect, rect, paint);        return output;    }}
然后就可以直接像其他View一样直接在XML中使用了.
例如
<com.zdsoft.blp.zidingyikongjian.AvatarImageView    android:id="@+id/iv_touxiang"    android:layout_width="180px"    android:layout_height="190px"    android:layout_gravity="center"    android:layout_margin="30px"    android:src="@drawable/wd_del" />
这样,在界面上显示的图像就是圆形的了.


0 0
原创粉丝点击