最近产品增加了两个小功能,一个是头像加一个进度条,用于升级提示,一个是身份标识功能,也就是标识Vip的功能,如图:

很多朋友看见这个小功能,肯定觉得特简单,就是两张图片叠在一起嘛,用个RelaiveLayout或者其他布局一下就搞定了 , 没错 , 是很简单,但是如果需要动态设置这个头像的大小,而且很多地方用到的话,在每个地方都去罗列的话,难免不开心并且出现大小错位等问题,找了好久没找到开源此控件的,只能自己动手了并分享给大家,效果图如下:

具体控件特性为:

  • 有进度条,进度条颜色、宽度可随意设置

  • 有标识身份,标识位置可随意改变、可隐藏

  • 标识身份的可以是图片,也可以隐藏图片,设置文字

下面来具体说一下实现思路。

圆形图片的实现

首先要解决的就是要把图片裁剪成圆形,这种控件很多,谷歌v4包下有个自带的 CircleImageView,不过没用过,用的是 hdodenhof 的

CircleImageView

https://github.com/hdodenhof/CircleImageView

源码也非常简单易上手。

其实这种图片可以这样理解,就是一个正方形里面有个大圆,还有个小圆,小圆和大圆的和为长方形边长,如图:

那么这个时候就可以自定义一个View继承 ViewGroup,命名为:IdentityImageView;由于小圆和大圆半径是有关系的,那么重写 onMeasure 方法可为:

初始化IdentityImageView

其中 addThreeView() 方法就是实例化出我们需要的两个圆形图片和一个 TextView;但是实例化出来的大小不是我们想要的,因此在 onMeasure方法 的结尾处,我们重新调整了一下各个控件的大小。

这些步骤大家都很熟悉,需要注意的是 setWillNotDraw(false) 这个方法,因为这里没有加载布局,如果没有此方法,onDraw方法 走不到,initAttrs(attrs) 就是获取自定义的属性,属性有:

标识图片的位置

属性中 smallRadius 的值为:

smallRadius = (int) (radius * radiusScale);

要放入小图片,肯定是在重写 onLayout方法,大图片也是如此,重写 onLayout方法,大图片容易实现,left 和 top 为 smallRadius,right 和 bottom 都为控件宽减去 totalwidth-smallRadius,关键是小图片的坐标如何确定,说肯定说不清楚,还是借一张西川地理位置图比较容易知道情况,如下:

只要得到图中所标的下x,y坐标,那么就可以得到小圆左上角坐标的具体值了,仔细看图就能明白,这是个几何问题,用到正弦余弦,也就是三角函数的 sin,cos,具体代码如下:

right 和 bottom 加上小圆的直径 smallRadius*2 就可以了;所以 onLayout方法 重写如下:

增加边框、进度条

下面就剩下外圆和进度条了,不用想是在 onDraw 里面用画笔画出来的,只不过这里面有几个坑:

  • Paint 的 setStrokeWidth方法,并不是往圆内侧增加圆环(圆弧)宽度的,而是往外侧增加一半,往内侧增加一半。

  • add 进来的 View(比如两个图片View)显示在画出来的圆弧上面,时间紧迫就没去搞明白怎么回事。

这两个坑让我调整了一下代码,把大圆的半径减去了圆弧宽度的一半,这样刚好,能看见圆弧,小图又能遮盖住圆弧,功能实现了就没想那么多,以后有时间再琢磨一下图层关系。

外圆边框和进度条的代码如下:

对外提供动态设置参数的方法

这里没涉及到点击滑动事件,所以没有重写分发事件一系列的方法,主要对外提供的方法有:

这样,带进度条和标识功能的原型图片就完成了,不熟悉自定义View的同学可以练一下,坑只有自己踩了才知道,有问题欢迎大家指正,共同进步!

github地址:

https://github.com/385841539/IdentityImageView

转载于:https://my.oschina.net/JiangTun/blog/911062

仿微博带vip标识功能的圆形头像相关推荐

  1. 自己写个仿微博的表情包功能

    ** 自己写个仿微博的表情包功能 ** 前两天写微博系统尝试着写一个表情包系统如图所示: 主体思想是先把图片罗列出来,加上title和name属性,当点击图片时获取图片的name属性,附加在输入框文本 ...

  2. PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现

    PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现 之前记录过一篇文章,不过那只是简单将二维码合成到海报中去,这次还要合成头像,而且是圆形.所需要素材就不一一列举,直接代码吧 1.先获取用 ...

  3. android点赞取消赞功能吗,Android 仿微博的点赞上报功能,持续点赞再取消

    产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网络之后 重 ...

  4. Android 仿微博的点赞上报功能,持续点赞再取消

    产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网络之后 重 ...

  5. android 开发艾特功能,Android 仿微博@ # 艾特 话题功能

    public class HtmlText extends TextView { private Context context; private String mData; //接口回调 priva ...

  6. Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展

    本文由"猫爸iYao"原创分享,感谢作者. 1.引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样: ▲ 微信群聊界面里的@人功能  ▲ Q ...

  7. android点赞取消赞功能吗,Android 仿微博的点赞功能的实现原理(持续点赞再取消)...

    搜索热词 产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网 ...

  8. 精仿黑鱼资源网 整站源码带完整数据 带SEO优化功能带广告位

    精仿黑鱼资源网源码带完整数据 带SEO优化功能带广告位 简介: 这款是黑鱼站长放出来的新版本,带资源和文章发布系统,非常有利于SEO,带大量广告位,对这款有兴趣的站长们 可以搭建体验! 安装教程: 空 ...

  9. android 仿微博评论编辑框_Android 仿微博的点赞功能的实现原理(持续点赞再取消)...

    产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网络之后 重 ...

最新文章

  1. 表格内部的文本对齐类
  2. python与js通用的数据结构_五种编程语言解释数据结构与算法——顺序表3(JavaScript与Python语言实现)...
  3. java中强引用、弱引用、软引用、虚引用学习
  4. Django: OperationalError / no such table
  5. idea怎么设置选中文件时,自动在左侧弹出文件所在位置及文件
  6. 黑客攻防技术宝典web实战篇:工具web服务器习题
  7. 快手无水印解析API
  8. vue+阿里的G2图表-antv+折线图
  9. 九安医疗预计第三季度净利7.56亿至10.56亿 上年同期为亏损
  10. MinGW-w64没有bin文件解决方法
  11. ADSL上网全攻略——故障解决
  12. 你的时间都去哪了?(一)数据分析指标
  13. 采用瑞昱RTL8852AE的WiFi 6模块RW6852-PCIE
  14. S3C2440之裸机之C语言按键点亮LED灯
  15. Briefings in bioinformatics2022 | 基于神经网络的分子性质预测通用优化策略
  16. Suggestion: use tools:overrideLibrary=xxx.xxx.xxx to force usage
  17. 线程同步(7种同步方法)
  18. Jenkins 管理员 admin 密码找回
  19. 十月十日JavaScript基础3
  20. 【Python爬虫实战】爬取IU高清大图

热门文章

  1. 推荐几个阿里、字节跳动,美团大佬的公众号
  2. 专业卸载工具Uninstall Tool软件安装教程
  3. python学到什么程度可以面试工作_Python学到什么程度可以面试工作(解答一)
  4. 关于php的所有问题,关 于 解 析 php 的 问 题
  5. gta4 oracle_gta4隐藏车第一章:初入自由城篇(8)_快吧单机游戏
  6. 游戏人工智能 读书笔记 (二) 游戏人工智能简史
  7. 数据库系统概论考试心得+复习指南
  8. Mac下大文件压缩成多个包,即分卷压缩
  9. 如何在微信小程序中使用.ttf字体
  10. 解决“存证难”,山东签订电子劳动合同超20万份-爱签电子合同