今天我们学习圆形头像的实现原理,先上图
demo实例
基本上能满足一般的圆形头像功能实现
其中包括控件的大小,控件四个角的弧度控制以及外圈的颜色和宽度
现在我们看看具体的使用:
<wxd.demo.demomaster.view.RotatingCircleView
android:id="@+id/rotating_circle_view"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/pic"
app:circle_color="#f00"
app:circle_kind="all"
app:circle_width="2dp" />
其中有三个自定义属性
app:circle_color 代表外圈的颜色
app:circle_width 代表外圈的宽度
app:circle_kind 代表圆形的展示方式,分五种
从上面的图中我们是可以看出来的,取值分别为:
<enum name="all" value="0" />
<enum name="top_left" value="1" />
<enum name="top_right" value="2" />
<enum name="bottom_left" value="3" />
<enum name="bottom_right" value="4" />
具体的使用方式就是这么简单,下面我们看看具体是怎么实现的
首先我们需要知道BitmapShader和Matrix这俩个东西
具体的作用说下,BitmapShader用于设置图片平铺方式,分三种:
:CLAMP(拉伸)、MIRROR(镜像)、REPETA(重复)
这里借用别人的图片一下看看是什么样子
拉伸
镜像
重复
大致表达的意思就是当图片大小不足控件的大小时,图片以外空白区域如何展示
该案例里面我们使用了CLAMP功能,具体代码实例:
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Matrix 这个本身叫做矩阵,放在图片处理中可以用于图片的拉伸,缩放,倾斜等一些操作,当我们的图片不满我们的控件时,我们可以控件图片的大小以适应控件,大概就是这个作用。
该案例里面我们用了俩个功能,缩放和位移,代码示意:
matrix.setScale(scale, scale);
matrix.postTranslate((int) (dx + 0.5f) + borderWidth, (int) (dy + 0.5f) + borderWidth);
当这俩种各种设置好之后,matrix可以设置给BitmapShader,代码:
bitmapShader.setLocalMatrix(matrix);
从bitmapShader的实例化那里我们就已经获取到了图片bitmap的必要信息,此时经过这些操作,bitmap的信息已经被携带在了paint里面,下面我们就可以利用携带了bitmap信息的paint任意画图,那么圆形头像的实现就很简单了,代码:
canvas.drawCircle(getWidth() / 2, getHeight() / 2, imgRadius, imgPaint);
看见了,就是利用最简单的画圆就可以实现我们的圆形头像,那么外边圆这里就不用细说了吧,再花一个半径比这个大一点的圆即可,好了,今天的自定义view就学习到这,代码实例见:
代码点我1-3