android实现圆形头像_android 圆形图片 头像-程序员宅基地

技术标签: Android  

https://blog.csdn.net/android_cll/article/details/54574778

 

二:实现步骤、

1.自定义一个转换工具类、

package com.common.base.util;


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

import com.common.base.R;

public class CircleImageView extends ImageView {

    /**
     * 头像转换工具类
     */
    private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;

    private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
    private static final int COLORDRAWABLE_DIMENSION = 1;

    private static final int DEFAULT_BORDER_WIDTH = 0;
    private static final int DEFAULT_BORDER_COLOR = Color.BLACK;

    private final RectF mDrawableRect = new RectF();
    private final RectF mBorderRect = new RectF();

    private final Matrix mShaderMatrix = new Matrix();
    private final Paint mBitmapPaint = new Paint();
    private final Paint mBorderPaint = new Paint();

    private int mBorderColor = DEFAULT_BORDER_COLOR;
    private int mBorderWidth = DEFAULT_BORDER_WIDTH;

    private Bitmap mBitmap;
    private BitmapShader mBitmapShader;
    private int mBitmapWidth;
    private int mBitmapHeight;

    private float mDrawableRadius;
    private float mBorderRadius;

    private boolean mReady;
    private boolean mSetupPending;

    public CircleImageView(Context context) {
        super(context);
    }

    public CircleImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        super.setScaleType(SCALE_TYPE);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);

        mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
        mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);

        a.recycle();

        mReady = true;

        if (mSetupPending) {
            setup();
            mSetupPending = false;
        }
    }

    @Override
    public ScaleType getScaleType() {
        return SCALE_TYPE;
    }

    @Override
    public void setScaleType(ScaleType scaleType) {
        if (scaleType != SCALE_TYPE) {
            throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (getDrawable() == null) {
            return;
        }

        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        setup();
    }

    public int getBorderColor() {
        return mBorderColor;
    }

    public void setBorderColor(int borderColor) {
        if (borderColor == mBorderColor) {
            return;
        }

        mBorderColor = borderColor;
        mBorderPaint.setColor(mBorderColor);
        invalidate();
    }

    public int getBorderWidth() {
        return mBorderWidth;
    }

    public void setBorderWidth(int borderWidth) {
        if (borderWidth == mBorderWidth) {
            return;
        }

        mBorderWidth = borderWidth;
        setup();
    }

    @Override
    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        mBitmap = bm;
        setup();
    }

    @Override
    public void setImageDrawable(Drawable drawable) {
        super.setImageDrawable(drawable);
        mBitmap = getBitmapFromDrawable(drawable);
        setup();
    }

    @Override
    public void setImageResource(int resId) {
        super.setImageResource(resId);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }

    private Bitmap getBitmapFromDrawable(Drawable drawable) {
        if (drawable == null) {
            return null;
        }

        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }

        try {
            Bitmap bitmap;

            if (drawable instanceof ColorDrawable) {
                bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
            } else {
                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
            }

            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            drawable.draw(canvas);
            return bitmap;
        } catch (OutOfMemoryError e) {
            return null;
        }
    }

    private void setup() {
        if (!mReady) {
            mSetupPending = true;
            return;
        }

        if (mBitmap == null) {
            return;
        }

        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

        mBitmapPaint.setAntiAlias(true);
        mBitmapPaint.setShader(mBitmapShader);

        mBorderPaint.setStyle(Paint.Style.STROKE);
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setColor(mBorderColor);
        mBorderPaint.setStrokeWidth(mBorderWidth);

        mBitmapHeight = mBitmap.getHeight();
        mBitmapWidth = mBitmap.getWidth();

        mBorderRect.set(0, 0, getWidth(), getHeight());
        mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);

        mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
        mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);

        updateShaderMatrix();
        invalidate();
    }

    private void updateShaderMatrix() {
        float scale;
        float dx = 0;
        float dy = 0;

        mShaderMatrix.set(null);

        if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
            scale = mDrawableRect.height() / (float) mBitmapHeight;
            dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
        } else {
            scale = mDrawableRect.width() / (float) mBitmapWidth;
            dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
        }

        mShaderMatrix.setScale(scale, scale);
        mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);

        mBitmapShader.setLocalMatrix(mShaderMatrix);
    }

}

2.xml的引用、

<com.common.base.util.CircleImageView
    android:id="@+id/touxian_id"
    android:layout_width="75dp"
    android:layout_height="75dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:src="@drawable/yonghu_touxiang" />

3.activity的实现、

private CircleImageView touxiang_id;
touxiang_id = (CircleImageView)findViewById(R.id.touxian_id)
BitmapHelp.displayOnImageView(mContext, holder.touxiang_id, mListy
      .getUser().getPic(), R.drawable.ic_launcher,
      R.drawable.ic_launcher);

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39654467/article/details/81153634

智能推荐

如何简单有效的删除win10英语美式键盘-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏3次。很多童鞋在装上搜狗等输入法后,无端就多出了一个不知道怎么删除的英语美式键盘,如下图虽然同样可以使用home+空格键切换输入法,但是每次都要切换这对于强迫症患者来说简直不能忍所以本人根据自己的使用情况写了一个方法指南,经过多次试验,发现它还是很能派上用场的大致原理就是再添加一次键盘然后再删除掉。步骤一:点击如图位置-打开“语言首选项”步骤二:(可以

glib-genmarshal_glib-genmarshal 不是executable-程序员宅基地

文章浏览阅读735次。glib-genmarshalglib-genmarshal — C code marshaller generation utility for GLib closures Synopsisglib-genmarshal [options...] [files...]Descriptionglib-genmarshal is a sma_glib-genmarshal 不是executable

julia_Julia关键字-程序员宅基地

文章浏览阅读342次。julia Julia| 关键词 (Julia | Keywords)Like other programming languages, Julia also has the set of some reserved words whose meanings are the predefined and They cannot be used as the identifiers name. ...

scss常见用法_scss常用-程序员宅基地

文章浏览阅读3.3w次,点赞4次,收藏21次。简介Sass 有两种语法规则(syntaxes),目前新的语法规则(从 Sass 3开始)被称为 “SCSS”( 时髦的css(Sassy CSS)),它是css3语法的的拓展级,就是说每一个语法正确的CSS3文件也是合法的SCSS文件,SCSS文件使用.scss作为拓展名。第二种语法别成为缩进语法(或者 Sass),它受到了Haml的简洁精炼的启发,它是为了人们可以用和css相近的但是更_scss常用

Samba服务配置及各项参数含义_valid users-程序员宅基地

文章浏览阅读5.4k次,点赞4次,收藏28次。Samba服务的主配置文件是smb.conf,默认在/etc/samba/目录下。smb.conf含有多个段,每个段由段名开始,直到下个段名。每个段名放在方括号中间。每段的参数的格式是:名称=指。配置文件中一行一个段名和参数,段名和参数名不分大小写。除了[global]段外,所有的段都可以看作是一个共享资源。段名是该共享资源的名字,段里的参数是该共享资源的属性。Samba安装好后,使用testpa..._valid users

爱奇艺2018.9.28笔试 清雨的自助餐_n种食物,排成一排,可以选择若干种,但是不能选择-程序员宅基地

文章浏览阅读287次。题目描述有N种食物,排成一排,选择里面的若干食物,但不能选择相邻的食物。一个也不选也是一种选择的方法。问有多少种选择的方法?输入:一个整数n输出:一个正整数表示答案样例输入:3样例输出:5提示:方法有1、2、3、1和3、不选。共5种。斐波那契n从1开始,f(1)=2f(2)=3f(3)=5…n = eval(input())li = [0]*3li[1]..._n种食物,排成一排,可以选择若干种,但是不能选择

随便推点

css解决图片固定大小后拉伸的问题_css img设置了大小依然被父盒子拉变形-程序员宅基地

文章浏览阅读2.5k次。css解决图片固定大小后拉伸的问题<div> <img src="/img/1.jpg" class="img" /></div><style>.img{ object-fit:cover;}</style>object-fit属性属性描述fill默认值。整个对象将完全填充此框。 如果对象的高宽比不匹配其框的宽高比,那么该对象将被拉伸以适应。contain整个对象在填充盒子的同时保留其长宽比,因此_css img设置了大小依然被父盒子拉变形

大一寒假算法题_输入年份和月份,输出这一年的这这个月有多少天。需要考虑闰年。8.阶乘之和:计算s=-程序员宅基地

文章浏览阅读7.2k次,点赞4次,收藏10次。1.整数反转给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321#include <stdio.h>int main(void){ long int a,s=0; long int i,k; scanf("%ld",&a); if(a<0) { a=-a; for(i=0;a!=0;..._输入年份和月份,输出这一年的这这个月有多少天。需要考虑闰年。8.阶乘之和:计算s=

Ubuntu 20.04 安装配置 GitLab_ubuntu安装git时pofix configuration 应该选择哪个-程序员宅基地

文章浏览阅读1k次。ubuntu20+gitlab_ubuntu安装git时pofix configuration 应该选择哪个

使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)_visual studio窗体应用实例-程序员宅基地

文章浏览阅读3k次。此处.Content属性应改为.Text属性。使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)_visual studio窗体应用实例

QQ客户端聊天窗口输入"/"自动变成表情 - 解决方案_qq聊天框输入/会变成表情包-程序员宅基地

文章浏览阅读9.3k次,点赞22次,收藏2次。解决问题:在聊天窗口打字时,输入英文字符`/`时,会自动变成表情,且无法取消,无法避免。_qq聊天框输入/会变成表情包

WMS与TMS实施流程-程序员宅基地

文章浏览阅读1.1k次。导读国内有庞大的仓储物流从业人员队伍,很多人想深入了解WMS与TMS究竟是什么。本文详细解析WMS与TMS的选型与实施。WMS实施(上)和其它软件项目的实施大同小异,这里整理了WMS选型和上线过程中容易被忽略的10大误区。1、过分相信软件商的系统演示。在演示会上,一定要控制交流的内容和进程,尽量使用自己的作业数据。2、只关注软件本身,忘了关注将来的实施顾问和厂商背景。再好的WMS也要在标准软件之外加上10%-50%的定制工作,最好签一份系统维护合同,虽然会花钱,但是来自厂家的支持永远巨划