前言
现在在大多数具有联系人功能APP上边,很多都具有字符索引栏的功能,以方便用户更快的定位到要找的联系人。尤其是在联系人数量比较多的时候,这个功能就显得尤为快速方便了。此篇博客,将教大家来实现这么一个字符滑动栏。话不多说,先看下效果图。
其中,最右侧的滑动栏我们称为“字符滑动栏”,命名为
CharSlideBar
; 中间显示字符的视图我们称为“字符指示视图”,命名为CharIndicateView
。
步骤
1、绘制出字符滑动栏
CharSlideBar
2、添加字符滑动栏CharSlideBar
的点击滑动监听事件
3、绘制出字符指示图CharIndicateView
4、字符滑动栏CharSlideBar
与字符指示图CharIndicateView
建立关联
具体实现
绘制出字符滑动栏CharSlideBar
自定义View属性
|
|
实现CharSlideBar
类,继承自View
同时实现其构造方法,并初始化相关自定义属性。
此处不再详细介绍,具体可参见上篇博客:Android自定义View:基础篇
重写onDraw(Canvas canvas)
方法
|
|
在该方法内:
- 首先得到索引栏的高度,除以所有字符的个数,即得到单个字符的高度,便实现了将所有字符平分高度的目的;
- 得到宽度的中间X值,目的是为了字符水平居中;
- 由于
canvas
的drawText()
方法中的y
值为Text的baseline
,所以要想实现文本的垂直方向居中,就必须计算出文本的垂直方向的中间线与所占布局中间线的偏移量; - 根据x、y值,以及竖直方向居中时的偏移量,我们将所有字符平均绘制在垂直方向上。
注:计算文本的垂直方向的中间线与所占布局中间线的偏移量的方法为:
首先看一下Android中的字体度量:
其中baseline
为基线,基线以上为负值,以下为正值。即top, ascent
为负值,descent, bottom
为正值。
如图,若想要文本垂直居中,则需要让文本中间线与布局中间线重合即可。所以对照此图就不难计算出两个中间线的偏移量了。
添加字符索引栏CharSlideBar
的点击滑动监听事件
重写onTouchEvent(MotionEvent event)
方法:
首先根据按下与抬起的动作来设置索引栏的背景色。同时根据获取的View的Y值来计算出按下的相应字符。根据Y值得到选中的位置即相应字符的方法为:
随后,我们为字符索引栏设置一个监听选中事件的接口,并添加设置方法,并在上述的selectedPositionByY(float y)
中实现了接口方法的回调。
这样我们就可以在相应的Activity中设置选中监听事件了。
绘制出字符指示视图CharIndicateView
自定义View属性
|
|
实现CharIndicateView
类,继承自TextView
|
|
字符指示布局的实现比较简单,直接继承自TextView
,在初始化中设置了文本的颜色、大小、圆角矩形背景,并默认隐藏了该布局。此外,还添加了showSelectedChar(String selectedChar)
方法,来显示相应的字符。
字符索引栏CharSlideBar
与字符指示视图CharIndicateView
建立关联
在CharSlideBar
我们添加如下关联方法:
然后在上述的selectedPositionByY(float y)
中调用了CharIndicateView
的showSelectedChar(String selectedChar)
方法。
到此,我们就可以实现本文开始时的效果了。
在应用中的使用方法
布局文件activity_main.xml
:
|
|
Activity:MainActivity
:
|
|
源码及Demo
Demo源码 请点击此处下载(https://github.com/shorr/notes_demo/tree/master/CharSlideBarDemo)