在项目中我们经常遇到需要显示圆形头像的需求,一般我们都使用hdodenhof/CircleImageView的这个开源控件实现(简洁,没多余的东西)。
     而在的项目中我经常遇到这样的一个需求:如果用户上传了头像就显示圆形头像,如果没有上传头像就在圆形背景上显示文字。或者是直接在圆形头像上添加文字。因此我就在CircleImageView基础上实现了一个CircleTextImageView的组件。
CircleTextImageView是一个什么样的组件呢,直接上图吧

1.只显示头像

2.圆形背景文字

3.头像+文字

分别的使用方法:

1.只显示头像

<com.thinkcool.circletextimageview.CircleTextImageViewxmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/profile_image"android:layout_width="96dp"android:layout_height="96dp"android:src="@drawable/hugh"app:citv_border_width="2dp"app:citv_border_color="#FF000000"/>

2.圆形背景文字

<com.thinkcool.circletextimageview.CircleTextImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"app:citv_border_color="@android:color/white"app:citv_border_width="2dp"android:layout_gravity="center"app:citv_text_text="照片"app:citv_text_size="32sp"app:citv_text_padding="35dp"app:citv_text_color="@android:color/white"app:citv_fill_color="#50555D"/>

3.头像+文字

<com.thinkcool.circletextimageview.CircleTextImageViewandroid:layout_width="96dp"android:layout_height="96dp"app:citv_border_color="@android:color/darker_gray"app:citv_border_width="2dp"android:layout_gravity="center"app:citv_text_text="晴朗"app:citv_text_size="32sp"app:citv_text_padding="35dp"android:src="@drawable/skye"app:citv_text_color="#ff99cc00"app:citv_fill_color="#50555D"/>

最后在build.gradle中添加组件即可:

compile 'com.github.thinkcool:circletextimageview:1.0.20151218'

github地址:
https://github.com/CoolThink/CircleTextImageView(还是那句话,喜欢的欢迎加星fork)

知其然知其所以然,最后说一下实现吧:
    简单的说下自定义控件的流程
    1.到attr.xml中declare-styleable申明自定义控件属性
    2.在构造函数中获取相应属性,并实现get,set函数
    3.onDraw中完成图像的绘制
    4.onMeasure中处理wrap_content时控件的大小

由于该控件是基于hdodenhof/CircleImageView实现的,我们就关注下不同的地方和需要注意的就可以了:

一.绘制文字

 if (!TextUtils.isEmpty(mTextString)) {Paint.FontMetricsInt fm = mTextPaint.getFontMetricsInt();canvas.drawText(mTextString,getWidth() / 2 - mTextPaint.measureText(mTextString) / 2,getHeight() / 2 - fm.descent + (fm.bottom - fm.top) / 2, mTextPaint);}

在drawText的时候:第三个参数需要传入的是文字的baseline(基准线:用过英文本子的都知道我们需要对齐并不是底部).
    关于baseline怎么求解:
    先了解下FontMetricsInt的各个成员:
    1.top:文字的顶部坐标
    2.bottom:文字的底部坐标
    3.descent:文字顶部(bottom)到baseline的距离
    要求解baseline之前我们先明确下我们的目标是为了让字体在y轴上居中:由于baseline是一个对于我们来说是一个抽象的位置,那我们就以bottom为参照来进行计算。
    1.字体的高度=bottom-top,为了让字体居中,所以将整个字体高度居中即可,因此有:bottom=getHeight()/2+(bottom-top)/2
    2.而根据descent的意义我们知道:baseline=bottom-descent;
    3.所以baseline=getHeight()/2+(bottom-top)/2-descent

二.处理wrap_content的情况的适配
    为什么要处理wrap_content的情况,因为控件是继承自imageView的,因此imageView的wrap_content是指的:控件的宽高等于src中图像的宽高。而我们由于添加了新功能因此要适应以下两个场景:
    1.当我们使用第二种场景(圆形背景文字)由于不需要指定src,会发现指定为wrap_content的时候控件的宽高为0.
    2.当我们使用第三种场景(头像+文字)的时候,使用wrap_content时如果我们的字体较多或者字符较长时发现文字显示不下或者大小不合适,因为此时控件的宽高为src图片的宽高,而图片较小是自然显示不下了。

因此我们需要进行重新测量重写onMeasure函数:

 @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int widthMeasureSpecMode=MeasureSpec.getMode(widthMeasureSpec);int widthMeasureSpecSize=MeasureSpec.getSize(widthMeasureSpec);int heightMeasureSpecMode=MeasureSpec.getMode(heightMeasureSpec);int heightMeasureSpecSize=MeasureSpec.getSize(heightMeasureSpec);if(!TextUtils.isEmpty(mTextString)){int textMeasuredSize= (int) (mTextPaint.measureText(mTextString));textMeasuredSize+=2*mTextPadding;if(widthMeasureSpecMode==MeasureSpec.AT_MOST&&heightMeasureSpecMode==MeasureSpec.AT_MOST){if(textMeasuredSize>getMeasuredWidth()||textMeasuredSize>getMeasuredHeight()){setMeasuredDimension(textMeasuredSize,textMeasuredSize);}}}}

在onMeasure函数里:我们先调用父类的的onMeasure进行测量,对于父类的测量:除了MeasureSpecMode为AT_MOST时其他的都遵循父类的测量。
    当为AT_MOST模式的时候:
    我们需要对比已经测量好的MeasureSpecSize和我们传入的文字的大小进行对比,当我们文字的大小更大时,我们就应该以文字的大小为控件的大小,当然还要加上textpadding的大小,才为控件的最终大小。

android圆形图片,圆形背景文字的CircleTextImageView开源组件相关推荐

  1. android画圆形背景图片,android圆形图片,圆形背景文字的CircleTextImageView开源组件...

    转[http://blog.csdn.net/ys408973279/article/details/50350313] 在项目中我们经常遇到需要显示圆形头像的需求,一般我们都使用hdodenhof/ ...

  2. Android中图片圆形设置三种方法介绍

    Android开发中经常会用到圆形图片,比如在用户头像设置,现在提供三种主要实现方式: 方案一:使用第三方图像框架 Fresco 1.添加依赖 dependencies {compile 'com.f ...

  3. Android ImageView到底怎么设置圆角图片?背景圆角?控件圆角?图片圆角?占位图圆角?

    前言 在我们实际开发应用的过程中,我想大家或多或少都遇到过需要加载圆角图片的场景,还有一些图片是四周圆角不对称,异性圆角等等情况. 我们可能会去网上或Github上搜索一些RoundImageView ...

  4. Android 更改纯色背景图片颜色,可实现一张背景圆形图片展示不同颜色

    Android 更改纯色背景图片颜色,可实现一张背景圆形图片展示不同颜色 项目中可能会遇到比如多个纯色圆形背景列表或者说纯色圆形头像背景,一般让UI设计师设计多张背景图:但是有更好的方法只需一张图就可 ...

  5. android 图片转换圆形 黑色背景,Android 更改纯色背景图片颜色,可实现一张背景圆形图片展示不同颜色...

    Android 更改纯色背景图片颜色,可实现一张背景圆形图片展示不同颜色 项目中可能会遇到比如多个纯色圆形背景列表或者说纯色圆形头像背景,一般让UI设计师设计多张背景图:但是有更好的方法只需一张图就可 ...

  6. Android --- 自定义ImageView 实现圆形图片

    自定义ImageView实现圆形图片,主要是在onDraw()方法中实现绘制圆形图片,在onMeasure()中测量圆形的半径并设置View的宽高.效果如下图 代码如下 public class Ci ...

  7. Android实现用户圆形头像和模糊背景设计

    1.效果展示 2.在build.gradle(Module)中的dependencies里面加入下面依赖 注意:glide依赖的版本 //图片加载框架 implementation 'jp.wasab ...

  8. android自定义带进度条的圆形图片

    前言:在项目听新闻的改版中需要实现环绕圆形新闻图片的进度条功能,作为技术预备工作我就去看了一些网上的相关的原理,做了一个自定义带进度条的圆形图片的demo,并将这个实现写成文章发布出来,谁需要了可以进 ...

  9. Android 心形图片心形ImageView、带边框的的心形图片和圆形图片

    源码地址:心形图片.心形ImageView.圆形图片.圆形ImageView 实际效果如下: 一.思路 1.图片尺寸:加载的图片尺寸不会完全统一,可以是正方形,长方形等,这里不需要考虑正方形,因为一般 ...

最新文章

  1. 第十六届智能车竞赛过程中都发生了什么:怎么感到今年更难呢?
  2. 算法时间复杂度lg是多少_时间复杂度入门理解
  3. ubuntu16搭建z-blog博客
  4. 重塑世界的区块链技术你必须要懂得
  5. 查看博客模板的css代码
  6. 总结运行SSIS包的几种方式
  7. 华为鸿蒙不再孤单mmes,华为Watch GT2新色图赏 简约时尚设计新增100种运动模式
  8. Java ByteArrayOutputStream reset()方法及示例
  9. treeset java_Java TreeSet add()方法与示例
  10. mysql清除旧版本_MYSQL使用INNODB时及时清理旧版本数据
  11. consul命令行查看服务_Go语言微服务架构实战:第十三节 微服务管理--Docker安装及运行consul节点...
  12. 第十章 深度强化学习-Prioritized Replay DQN
  13. 使用EasyExcel读取excel文件案例
  14. Unity TextMeshPro显示中文
  15. 【YY手机】用AVR单片机制作手机系列教程-基础篇
  16. 欢迎使用传真服务器系统,coFax传真服务器 OCR页面号码识别传真
  17. 计算机共享访问权限,设置电脑共享权限、电脑文件共享权限设置、设置共享文件夹访问权限的方法...
  18. RCC_APB2Periph_AFIO时钟一般在什么时候下需要开启?
  19. 那些悄悄变厉害的人,都在偷偷对自己下狠手
  20. java实现变声器--变声萝莉

热门文章

  1. Monkey King(左偏树 可并堆)
  2. ECNU ||西班牙馅饼
  3. 韶音骨传导耳机值得入手吗?南卡和韶音骨传导耳机实测对比
  4. 5G标准核心内容:R15+R16(内含赠书福利)
  5. 软考可以不考初级直接考中级吗?
  6. 使用workflow客制出货通知单
  7. 计算机组成原理:系统总线总结
  8. golang时间字符串转时间戳
  9. 排行前50的编程语言
  10. 【Web 基础】Cookie