android实现圆形头像_JIN哥的博客-程序员秘密

技术标签: 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

智能推荐

flutter--OC 原生混编_flutter和oc混编_Coding_Physical的博客-程序员秘密

一、集成混合开发环境001 建立flutter_module% flutter create -t module flutter_moduleCreating project flutter_module... flutter_module/test/widget_test.dart (created) flutter_module/flutter_module.iml (created) flutter_module/.gitignore (created) flutter_.

VC++动态链接库编程之MFC规则DLL_jack1003的博客-程序员秘密

第4节我们对非MFC DLL进行了介绍,这一节将详细地讲述MFC规则DLL的创建与使用技巧。   另外,自从本文开始连载后,收到了一些读者的e-mail。有的读者提出了一些问题,笔者将在本文的最后一次连载中选取其中的典型问题进行解答。由于时间的关系,对于读者朋友的来信,笔者暂时不能一一回复,还望海涵!由于笔者的水平有限,文中难免有错误和纰漏,也热诚欢迎读者朋友不吝指正!

ccf 认证 201604-4:游戏_jk_x的博客-程序员秘密

解题思路:学过搜索的一眼就能看出是广搜,没学过建议翻翻书,毕竟考得挺多。 注意事项: 1.广搜用队列来实现,也可用数组循环来实现。 2.需要优化,不然会出现超时。 3.通关最长时间不超过300秒。 4.可以往回走。 5.每走一步都要判断是否安全和是否可达。 6.最关键的一个条件,不太容易在短时间想到:同一个节点同一时刻只能加队列一次。必须加上这个条件不然

(适用于主机连接WiFi的情况)解决vmware workstation的Ubuntu虚拟机无法联网的问题_邪三一的博客-程序员秘密

背景介绍:主机用的是WiFi,虚拟机的Ubuntu是用的以太网,并且设置的是静态ip,VM网络配置的是自定义。平时主机可以在关闭WiFi且连接网线的情况下ping通虚拟机。综上情况,我想让Ubuntu也能上网,于是搜索相关解决方案,在结合网上大佬们的方案后我摸索出一个解决方案,方案如下:第一步打开VM的可移动设备,再选择网络适配器,再选择设置。第二步选择网络连接为自定义,选择VMnet...

eclipse的svn提交时如果断网,选择取消后等待时间太长、卡住,解决办法_svn http-timeout_拉比小猪的博客-程序员秘密

eclipse的svn提交时如果断网,选择取消后等待时间太长,怎么解决?使用Eclipse通过VPN连接到SVN。有时VPN连接断开,忘记重连VPN就提交时,必须等待10分钟直到超时。等待时间太长怎么办?解决办法:修改SVN连接超时的时间。具体修改servers文件如下C:\用户\用户名\AppData\Roaming\Subversion\servers我的路径是:C:\Users\xxx\AppData\Roaming\Subversion\servers记事本打开servers搜索[gl

随便推点

SQL server开发记录,字符串分割成数组再单个匹配其他表,解决过程,遗留问题。_sqlserver 分割后匹配_依然饭特香7的博客-程序员秘密

原表字段过于多,为了记录新建了两个表,大致记录一下。test1(Code)表记录员工的编号,test2(Code,Name)记录员工编号和对应的名称CREATE TABLE [dbo].[Test1] ( [Id] int IDENTITY(1,1) NOT NULL, [Code] nvarchar(25) DEFAULT '' NOT NULL) CREATE TABLE [dbo].[Test2] ( [Id] int IDENTITY(1,1) NOT NULL,

Tomcat启动命令_icemanws的博客-程序员秘密

1、跳转至Tomcat主目录:cd /usr/local/tomcat1 2、查看Tomcat是否运行:ps -elf | grep java3、关闭Tomcat:bin/shutdown.sh 或catalina.sh stop 4、查看Tomcat是否还在运行:ps -elf | grep java 5、强制关闭:kill -9 12062(图中

java实现文件自动打包成zip并下载…_随便起个不重复的名字的博客-程序员秘密

1.首先实现java多文件压缩package main;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;public class Te

Kafka2.0生产者客户端源码分析 - Sender线程_weixin_30781107的博客-程序员秘密

  Kafka 在初始化生产者客户端时,创建并启动 Sender 线程。通过 Sender 线程来发送消息、处理消息的响应。通过“volatile boolean running”状态控制 Sender 线程不断轮询,调用 NetworkClient 的 poll 方法。NetworkClient 是 Kafka 实现的用来和 broker 通信的类,实现了 KafkaClient 接口,底层实际...

golang中GOPATH的简单理解_沐-羽晨的博客-程序员秘密

1、为什么要配置GOPATH配置GOPATH的用意是为了方便项目的部署和构建,以及可以直接使用go get 命令下载第三方的包到自己的项目的src下和相关的执行文件bin目录,和中间文件pkgsrc :项目的源代码pkg :编译后的生成文件bin : 编译后的可执行文件如果你只是想单独的写个go代码可以不设置GOPATH2、结合GoLand来讲解GOPATH2.1:使用...

推荐文章

热门文章

相关标签