Android快速打造超简单CircleImageView

来源:互联网 发布:相册制作软件下载 编辑:程序博客网 时间:2024/05/16 18:00

现在很多项目很多地方都运用上了圆形ImageView显示头像或者图片,android原生的ImageView已经满足不了我很的需求,so我们就自定义个吧!
效果图:
CircleImageView

1.首先肯定先继承ImageView,再来几个构造方法,并初始化画笔一支

public class CircleImageView extends ImageView {    /*画笔*/    private Paint paint;    public CircleImageView(Context context) {        super(context);        init();    }    public CircleImageView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    private void init() {        paint = new Paint();    } }

2.重写onDraw()方法

    @Override    protected void onDraw(Canvas canvas) {        //获取一张图片        Drawable drawable = getDrawable();        /*如果获取src为空*/        if (drawable == null) {            return;        }        if (getWidth() == 0 && getHeight() == 0) {            return;        }        if (!(drawable instanceof BitmapDrawable)) {            return;        }        Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();        if (bitmap == null) {            return;        }    }

3.最重要的部分,放心都有备注

 private Bitmap circleDraw(Bitmap bitmap) {        int radius;        int width = this.getWidth();        int height = this.getHeight();        if (width > height) {            radius = width;        } else {            radius = height;        }        Bitmap output = Bitmap.createBitmap(radius, radius,                Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(output);        Rect rect = new Rect(0, 0, width, height);        /*抗锯齿*/        paint.setAntiAlias(true);        paint.setFilterBitmap(true);        /*防抖动*/        paint.setDither(true);        /*canvas上绘制圆以外的区域为透明度的黑色,圆内区域为透明:*/        canvas.drawARGB(0, 0, 0, 0);        canvas.drawCircle(radius / 2,                radius / 2, radius / 2, paint);        /*详情请参考http://www.cnblogs.com/rayray/p/3670120.html*/        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));        /*修改图片大小*/        bitmap = Bitmap.createScaledBitmap(bitmap, radius, radius, true);        canvas.drawBitmap(bitmap, rect, rect, paint);        return output;    }

总体就这样

package com.kekegdsz.www.circleimageview;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;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 2016/10/27. */public class CircleImageView extends ImageView {    /*画笔*/    private Paint paint;    public CircleImageView(Context context) {        super(context);        init();    }    public CircleImageView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    private void init() {        paint = new Paint();    }    @Override    protected void onDraw(Canvas canvas) {        //获取一张图片        Drawable drawable = getDrawable();        /*如果获取src为空*/        if (drawable == null) {            return;        }        if (getWidth() == 0 && getHeight() == 0) {            return;        }        if (!(drawable instanceof BitmapDrawable)) {            return;        }        Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();        if (bitmap == null) {            return;        }        /*主要函数*/        Bitmap circleDraw = this.circleDraw(bitmap);        /*清空画笔*/        this.paint.reset();        canvas.drawBitmap(circleDraw, 0, 0, null);    }    private Bitmap circleDraw(Bitmap bitmap) {        int radius;        int width = this.getWidth();        int height = this.getHeight();        if (width > height) {            radius = width;        } else {            radius = height;        }        Bitmap output = Bitmap.createBitmap(radius, radius,                Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(output);        Rect rect = new Rect(0, 0, width, height);        /*抗锯齿*/        paint.setAntiAlias(true);        paint.setFilterBitmap(true);        /*防抖动*/        paint.setDither(true);        /*canvas上绘制圆以外的区域为透明度的黑色,圆内区域为透明:*/        canvas.drawARGB(0, 0, 0, 0);        canvas.drawCircle(radius / 2,                radius / 2, radius / 2, paint);        /*详情请参考http://www.cnblogs.com/rayray/p/3670120.html*/        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));        /*修改图片大小*/        bitmap = Bitmap.createScaledBitmap(bitmap, radius, radius, true);        canvas.drawBitmap(bitmap, rect, rect, paint);        return output;    }}

使用:

   <com.kekegdsz.www.circleimageview.CircleImageView       android:layout_width="100dp"       android:src="@drawable/kekegdsz"       android:layout_height="100dp" />

源码下载地址:http://download.csdn.net/detail/kekegdsz/9666218

0 0
原创粉丝点击