自定义圆形头像CircleImageView的使用

效果图:


使用:


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();

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容