android ImageView 自定义圆形图片 圆形头像

有些时候我们需要将图片展示成圆形,曾经自己写了个简单的,今天贴出来记录一下,简单方便,代码可以直接使用

package com.cleanmaster.bitmapcache;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Rect;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.ViewGroup;

import com.cleanmaster.base.util.system.DimenUtils;

public class PersonalCenterHeadView extends ImageView{
    private int mHeight = 0;
    private int mWidth = 0;
    private int mColor = Color.TRANSPARENT;
    private int mStrokeWidth = 0;
    private boolean mIsDrawerWithConer = true;
    private boolean mHasShadow = false;
    private int mShadowColor= Color.GRAY;
    private Bitmap bm = null;
    private PaintFlagsDrawFilter drawFilter = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG);
    protected Rect iconRect = new Rect(0, 0, 0, 0);

    public PersonalCenterHeadView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setDrawerWithConer(boolean withConer){
        mIsDrawerWithConer = withConer;
    }

    public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
        int radius = bitmap.getWidth() / 2;
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT,  Shader.TileMode.REPEAT);

        //画阴影
        if(mHasShadow){
            Paint paintBottom = new Paint();
            paintBottom.setAntiAlias(true);
            paintBottom.setColor(mShadowColor);
            canvas.drawCircle(radius, radius+1, radius-mStrokeWidth+3, paintBottom);
        }

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setShader(bitmapShader);
        canvas.drawCircle(radius, radius, radius-mStrokeWidth, paint);

        //画边框
        Paint paintBorder = new Paint();
        paintBorder.setStyle(Paint.Style.STROKE);//这个style设置为stroke之后就是会画出一个环形
        paintBorder.setStrokeWidth(mStrokeWidth);//这个设置环形的宽度
        paintBorder.setAntiAlias(true);
        paintBorder.setColor(mColor);
        
        canvas.drawCircle(radius, radius, radius-mStrokeWidth, paintBorder);

        return output;
    }

    public void setStrokeWidth(int strokeWidth) {
        this.mStrokeWidth = strokeWidth;
    }

    public void setShadow(boolean hasShadow){
        mHasShadow = hasShadow;
    }

    public void setShadowColor(int color){
        mShadowColor = color;
    }

    //设置颜色
    public void setColour(int color){
        this.mColor = color;
    }

    public synchronized void setimage(Bitmap bitmap) {
        int max = DimenUtils.dp2px(getContext(), 64);
        if(bitmap.getHeight() > 0){
            ViewGroup.LayoutParams params = getLayoutParams();
            mWidth = bitmap.getWidth();
            if(mWidth >= max){
                mWidth = max;
            }
            mHeight = bitmap.getHeight();
            if(mHeight >= max){
                mHeight = max;
            }
            if(null == params){
                params = new ViewGroup.LayoutParams(mWidth, mHeight);
            }
            params.width = mWidth;
            params.height = mHeight;
            setLayoutParams(params);
            invalidate();
        }
    }

    private void initPaint() {
        paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
        paint.setColor(Color.WHITE);
        paint.setTextAlign(Paint.Align.CENTER);
    }

    public void setImageBitmap(Bitmap object) {
        bm = object;
        invalidate();
    }

    private int measureSize(int measureSpec) {
        return MeasureSpec.getSize(measureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (paint == null) { initPaint(); }
        if (iconRect == null || paint == null) { return; }
        canvas.setDrawFilter(drawFilter); // 去除锯齿
        if (null != bm && !bm.isRecycled()) {
            Bitmap bitmap = getRoundedCornerBitmap(bm);
            if (bitmap != null) {
                canvas.drawBitmap(bitmap, null, iconRect, paint);
            }
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = measureSize(widthMeasureSpec);
        int height = measureSize(heightMeasureSpec);
        iconRect.set(0, 0, width, height);
    }

}

其实当该控件被调用的时候,会调用onDraw方法将图片画上去,在此之前需要对bitmap进行处理,上面黑体字便是关键的代码,其实只要拿到bitmap就能够处理成各种形状

猜你喜欢

转载自blog.csdn.net/weixin_36709064/article/details/82048585