android原生自定义两种头像方式

第一种、不带圆形外圈头像

package com.activitytest.pengintohospital.utils;import android.content.Context;
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.Rect;
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;/**** 圆形图片**/public class mine_ImageViewPlus extends ImageView{private Paint mPaintBitmap = new Paint(Paint.ANTI_ALIAS_FLAG);private Paint mPaintBorder = new Paint(Paint.ANTI_ALIAS_FLAG);private Bitmap mRawBitmap;private BitmapShader mShader;private Matrix mMatrix = new Matrix();private float mBorderWidth = dip2px(15);private int mBorderColor = 0x80bebebe;public mine_ImageViewPlus(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {Bitmap rawBitmap = getBitmap(getDrawable());if (rawBitmap != null){int viewWidth = getWidth();int viewHeight = getHeight();int viewMinSize = Math.min(viewWidth, viewHeight);float dstWidth = viewMinSize;float dstHeight = viewMinSize;if (mShader == null || !rawBitmap.equals(mRawBitmap)){mRawBitmap = rawBitmap;mShader = new BitmapShader(mRawBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);}if (mShader != null){mMatrix.setScale((dstWidth - mBorderWidth * 2) / rawBitmap.getWidth(), (dstHeight - mBorderWidth * 2) / rawBitmap.getHeight());mShader.setLocalMatrix(mMatrix);}mPaintBitmap.setShader(mShader);mPaintBorder.setStyle(Paint.Style.STROKE);mPaintBorder.setStrokeWidth(mBorderWidth);mPaintBorder.setColor(mBorderColor);float radius = viewMinSize / 2.0f;canvas.drawCircle(radius, radius, radius - mBorderWidth / 2.0f, mPaintBorder);canvas.translate(mBorderWidth, mBorderWidth);canvas.drawCircle(radius - mBorderWidth, radius - mBorderWidth, radius - mBorderWidth, mPaintBitmap);} else {super.onDraw(canvas);}}private Bitmap getBitmap(Drawable drawable){if (drawable instanceof BitmapDrawable){return ((BitmapDrawable)drawable).getBitmap();} else if (drawable instanceof ColorDrawable){Rect rect = drawable.getBounds();int width = rect.right - rect.left;int height = rect.bottom - rect.top;int color = ((ColorDrawable)drawable).getColor();Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);canvas.drawARGB(Color.alpha(color), Color.red(color), Color.green(color), Color.blue(color));return bitmap;} else {return null;}}private int dip2px(int dipVal) {float scale = getResources().getDisplayMetrics().density;return (int)(dipVal * scale + 0.5f);}
}

第二种、带圆形外圈头像

package com.activitytest.pengintohospital.utils;import android.content.Context;
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.Rect;
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;/**** 带边框的圆形图片* */public class ImageViewPlus extends ImageView{private Paint mPaintBitmap = new Paint(Paint.ANTI_ALIAS_FLAG);private Paint mPaintBorder = new Paint(Paint.ANTI_ALIAS_FLAG);//private Bitmap mRawBitmap;private BitmapShader mShader;private Matrix mMatrix = new Matrix();private float mBorderWidth = dip2px(15);private int mBorderColor = 0xFF0080FF;//外边框的颜色public ImageViewPlus(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {Bitmap rawBitmap = getBitmap(getDrawable());if (rawBitmap != null){int viewWidth = getWidth();int viewHeight = getHeight();int viewMinSize = Math.min(viewWidth, viewHeight);float dstWidth = viewMinSize;float dstHeight = viewMinSize;if (mShader == null || !rawBitmap.equals(mRawBitmap)){mRawBitmap = rawBitmap;mShader = new BitmapShader(mRawBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);}if (mShader != null){mMatrix.setScale((dstWidth - mBorderWidth * 2) / rawBitmap.getWidth(), (dstHeight - mBorderWidth * 2) / rawBitmap.getHeight());mShader.setLocalMatrix(mMatrix);}mPaintBitmap.setShader(mShader);mPaintBorder.setStyle(Paint.Style.STROKE);mPaintBorder.setStrokeWidth(mBorderWidth / 5.0f);//外边框的大小mPaintBorder.setColor(mBorderColor);//添加外边框float radius = viewMinSize / 2.0f;canvas.drawCircle(radius, radius, radius - mBorderWidth / 6.0f, mPaintBorder);canvas.translate(mBorderWidth, mBorderWidth);canvas.drawCircle(radius - mBorderWidth, radius - mBorderWidth, radius, mPaintBitmap);} else {super.onDraw(canvas);}}private Bitmap getBitmap(Drawable drawable){if (drawable instanceof BitmapDrawable){return ((BitmapDrawable)drawable).getBitmap();} else if (drawable instanceof ColorDrawable){Rect rect = drawable.getBounds();int width = rect.right - rect.left;int height = rect.bottom - rect.top;int color = ((ColorDrawable)drawable).getColor();Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);canvas.drawARGB(Color.alpha(color), Color.red(color), Color.green(color), Color.blue(color));return bitmap;} else {return null;}}private int dip2px(int dipVal) {float scale = getResources().getDisplayMetrics().density;return (int)(dipVal * scale + 0.5f);}
}

第三种、

public class HaedCircleImageView extends ImageView{public HaedCircleImageView(Context context) {super(context);// TODO Auto-generated constructor stub}public HaedCircleImageView(Context context, AttributeSet attrs) {super(context, attrs);}public HaedCircleImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overrideprotected void onDraw(Canvas canvas) {Drawable drawable = getDrawable();if (drawable == null) {return;}if (getWidth() == 0 || getHeight() == 0) {return;}Bitmap b =  ((BitmapDrawable)drawable).getBitmap() ;Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);int w = getWidth(), h = getHeight();Bitmap roundBitmap =  getCroppedBitmap(bitmap, w);canvas.drawBitmap(roundBitmap, 0,0, null);}public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {Bitmap sbmp;if(bmp.getWidth() != radius || bmp.getHeight() != radius)sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);elsesbmp = bmp;Bitmap output = Bitmap.createBitmap(sbmp.getWidth(),sbmp.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(output);final int color = 0xffa19774;final Paint paint = new Paint();final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());paint.setAntiAlias(true);paint.setFilterBitmap(true);paint.setDither(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(Color.parseColor("#BAB399"));canvas.drawCircle(sbmp.getWidth() / 2+0.7f, sbmp.getHeight() / 2+0.7f,sbmp.getWidth() / 2+0.1f, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(sbmp, rect, rect, paint);return output;}
}

在Xml中使用

<com.activitytest.pengintohospital.utils.ImageViewPlusandroid:id="@+id/mine_iv_headportrait"android:layout_width="100dp"android:layout_height="100dp"android:src="@mipmap/hospital" />

-   END

android原生自定义头像View相关推荐

  1. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  2. Android中自定义视图View

    标签: 前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用 ...

  3. Android中自定义视图View之---前奏篇

    前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自 ...

  4. Android:手把手教你自定义头像View,可根据名字自动生成背景色+文字的显示效果,含动画效果。

    首先看需要做成的效果,如下所示

  5. Android开发自定义的View

    2019独角兽企业重金招聘Python工程师标准>>> 当开发者打算派生自己的UI组件时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法,通常可以被用户重写的 ...

  6. android canvas_Android自定义View之绘制虚线

    开发中遇到需要画虚线,我们首先就会想到ShapeDrawable,在布局中加一个View,并给它添加一个虚线背景,是挺简单的. <?xml version="1.0" enc ...

  7. Android开发自定义View之滑动按钮与自定义属性

    写博客辛苦了,转载的朋友请标明出处哦,finddreams:(http://blog.csdn.net/finddreams/article/details/40392975) 话不多说,先运行效果图 ...

  8. android人脸识显示头像自定义,Android 仿QQ头像自定义截取功能

    看了Android版QQ的自定义头像功能,决定自己实现,随便熟悉下android绘制和图片处理这一块的知识. 先看看效果: 思路分析: 这个效果可以用两个View来完成,上层View是一个遮盖物,绘制 ...

  9. android自定义组合view,自定义View之组合View

    前言 自定义View是安卓开发中比较重要的一环,很多地方都需要用到自定义View.而自定义View比较常见的一种形式就是组合View,也是比较简单的一种方式.下面通过一个实例来学习一下自定义组合vie ...

最新文章

  1. 两台winXP电脑不能互相访问共享文件夹故障的最终解决方法
  2. nodejs+express4.0+mongodb安装方法 for Linux, Mac
  3. 剑指Offer-求1+2+3+...+n
  4. python里面的正则表达式_Python中的正则表达式
  5. Rsyslog 日志相关内容
  6. 分布与并行计算—用任务管理器画CPU正弦曲线(Java)
  7. Ubuntu 右键打开终端
  8. 【图像融合】基于matalb小波变换(加权平均法+局域能量+区域方差匹配)图像融合【含Matlab源码 1819期】
  9. 常用自动化测试工具介绍(支持B/S、C/S)
  10. 从酒店服务员到世界500强大数据工程师,月薪4K到年薪40W,我经历了什么?
  11. 【第158期】游戏策划:给@zhang的简历分析
  12. Oracle的云计算模式
  13. javascript引入方式:嵌入式,外链式,行内式
  14. 单片机位寻址举例_51单片机直接寻址方式与编程举例
  15. Windows Server 2008 R2 C盘空间不足解决方法
  16. javaweb_util_excel模板横向纵向循环
  17. H3C室外无线AP(WA4320X)胖瘦切换设置方法
  18. 卓有成效的管理者—第八章 结论:管理者必须卓有成效
  19. CSDN 博客 修改文章搜索为 bing 搜索,且只搜索自己的博客的方法
  20. python实现手写笔迹,手写识别,语音识别,语音生成

热门文章

  1. delphi实现屏幕截图
  2. 魔道电子——肖特基二极管、整流二极管
  3. 联想R9000P笔记本系统故障无法启动怎么重装系统?
  4. arch linux 包管理器,archlinux 包管理
  5. cocos2dx-JniHelper 使用
  6. 编写五子棋的完整python代码_python开发 实现单机五子棋!
  7. 黑客讲故事:攻下隔壁女生路由器后,我都做了些什么~
  8. ejb能调用另一个ejb吗_EJB 3词汇表
  9. WPS禁用通配符和列前加统一字符
  10. 完成各种项目生态环评工作丨全流程基于最新导则下的生态环境影响评价技术方法及图件制作与案例