自定义圆形头像CircleImageView的使用

效果图:


自定义圆形头像CircleImageView的使用_第1张图片

使用:


自定义圆形头像CircleImageView的使用_第2张图片

2个类:

CircleImageView类:

package com.lzyi.tpm.utils;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.RectF;

import android.util.AttributeSet;

import io.jchat.android.view.BaseImageView;

public class CircleImageViewextends BaseImageView {

public CircleImageView(Context context) {

super(context);

    }

public CircleImageView(Context context, AttributeSet attrs) {

super(context, attrs);

    }

public CircleImageView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

    }

public static BitmapgetBitmap(int width, int height) {

Bitmap bitmap = Bitmap.createBitmap(width, height,

                Bitmap.Config.ARGB_8888);

        Canvas canvas =new Canvas(bitmap);

        Paint paint =new Paint(Paint.ANTI_ALIAS_FLAG);

        paint.setColor(Color.BLACK);

        canvas.drawOval(new RectF(0.0f, 0.0f, width, height), paint);

        return bitmap;

    }

@Override

    public BitmapgetBitmap() {

return getBitmap(getWidth(), getHeight());

    }

}

BaseImageView类:

package io.jchat.android.view;

import android.annotation.SuppressLint;

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.Xfermode;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.ImageView;

import java.lang.ref.WeakReference;

public abstract class BaseImageViewextends ImageView {

private static final StringTAG = BaseImageView.class.getSimpleName();

    protected ContextmContext;

    private static final XfermodesXfermode =new PorterDuffXfermode(PorterDuff.Mode.DST_IN);

//    private BitmapShader mBitmapShader;

    private BitmapmMaskBitmap;

    private PaintmPaint;

    private WeakReferencemWeakBitmap;

    public BaseImageView(Context context) {

super(context);

        sharedConstructor(context);

    }

public BaseImageView(Context context, AttributeSet attrs) {

super(context, attrs);

        sharedConstructor(context);

    }

public BaseImageView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

        sharedConstructor(context);

    }

private void sharedConstructor(Context context) {

mContext = context;

        mPaint =new Paint(Paint.ANTI_ALIAS_FLAG);

    }

public void invalidate() {

mWeakBitmap =null;

        if (mMaskBitmap !=null) {mMaskBitmap.recycle(); }

super.invalidate();

    }

@SuppressLint("DrawAllocation")

@Override

    protected void onDraw(Canvas canvas) {

if (!isInEditMode()) {

int i = canvas.saveLayer(0.0f, 0.0f, getWidth(), getHeight(),

                    null, Canvas.ALL_SAVE_FLAG);

            try {

Bitmap bitmap =mWeakBitmap !=null ?mWeakBitmap.get() :null;

                // Bitmap not loaded.

                if (bitmap ==null || bitmap.isRecycled()) {

Drawable drawable = getDrawable();

                    if (drawable !=null) {

// Allocation onDraw but it's ok because it will not always be called.

                        bitmap = Bitmap.createBitmap(getWidth(),

                                getHeight(), Bitmap.Config.ARGB_8888);

                        Canvas bitmapCanvas =new Canvas(bitmap);

                        drawable.setBounds(0, 0, getWidth(), getHeight());

                        drawable.draw(bitmapCanvas);

                        // If mask is already set, skip and use cached mask.

                  if (mMaskBitmap ==null ||mMaskBitmap.isRecycled()) {

mMaskBitmap = getBitmap();

                  }

// Draw Bitmap.

                        mPaint.reset();

                        mPaint.setFilterBitmap(false);

                        mPaint.setXfermode(sXfermode);

//                        mBitmapShader = new BitmapShader(mMaskBitmap,

//                                Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

//                        mPaint.setShader(mBitmapShader);

                        bitmapCanvas.drawBitmap(mMaskBitmap, 0.0f, 0.0f, mPaint);

                        mWeakBitmap =new WeakReference(bitmap);

                    }

}

// Bitmap already loaded.

                if (bitmap !=null) {

mPaint.setXfermode(null);

//                    mPaint.setShader(null);

                    canvas.drawBitmap(bitmap, 0.0f, 0.0f, mPaint);

return;

                }

}catch (Exception e) {

System.gc();

                Log.e(TAG, String.format("Failed to draw, Id :: %s. Error occurred :: %s", getId(), e.toString()));

            }finally {

canvas.restoreToCount(i);

            }

}else {

super.onDraw(canvas);

        }

}

public abstract BitmapgetBitmap();

}

你可能感兴趣的:(自定义圆形头像CircleImageView的使用)