专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
郭霖  ·  从源码到定制:全面解析 Android ... ·  3 天前  
鸿洋  ·  卡顿监测的方方面面 ·  3 天前  
郭霖  ·  HarmonyOS ... ·  6 天前  
郭霖  ·  HarmonyOS ... ·  5 天前  
鸿洋  ·  大图检测插件的落地 ·  4 天前  
51好读  ›  专栏  ›  郭霖

仿微博带vip标识功能的圆形头像

郭霖  · 公众号  · android  · 2017-05-18 08:00

正文

今日科技快讯

昨日,共享单车平台ofo宣布将品牌名称更改为“ofo小黄车”。另一方面,联合国开发计划署(UNDP)还与ofo小黄车宣布在全球范围内启动“一公里计划”,双方将在全球合作推广低碳环保的单车出行方式。ofo小黄车计划将每月17日设为“一公里计划”的“活动日”,当天收入将捐赠用于环保教育、城市可持续、气候变化相关问题的解决。

作者简介

本篇是 哦罢了 的第二篇投稿,分享了自己的一个自定义角标控件,功能全面,希望大家喜欢。

哦罢了 的博客地址:

http://blog.csdn.net/iamdingruihaha

前言

最近产品增加了两个小功能,一个是头像加一个进度条,用于升级提示,一个是身份标识功能,也就是标识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

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: