有段时间没写博客了,趁今天有空就写了一篇。今天的主题就是仿联系人界面。相信大家在平时都见过,就是可以实现快速索引的侧边栏。比如在美团中选择城市的界面:
我们可以看到在右侧有一个支持快速索引的栏。接下来,我们就要实现这种索引栏。
首先是attrs.xml
,定义了三个自定义属性:
1 | <?xml version="1.0" encoding="utf-8"?> |
之后我们创建一个类继承自View
,类名就叫QuickIndexBar
:
1 | // 默认字体颜色 |
上面的代码就是在构造器中初始化了自定义属性,大家应该都能看懂。
1 | // 快速索引的字母 |
然后在onSizeChanged(int w, int h, int oldw, int oldh)
中获取width
和height
。还要计算cellHeight
,也就是INDEX_ARRAYS
中每个字符串所占用的高度,以便在onDraw(Canvas canvas)
中使用。
我们来看看onDraw(Canvas canvas)
:
1 | @Override |
在代码中去遍历INDEX_ARRAYS
,测量出字母的宽度和高度。这里要注意的是,canvas.drawText(String text, float x, float y, Paint paint)
中的 x,y 指的是字母左下角的坐标,并不是“原点”。
别忘了我们还要对QuickIndexBar
的触摸事件作出处理。所以我们要重写onTouchEvent(MotionEvent event):
1 | /** |
在ACTION_DOWN
和ACTION_MOVE
计算出了触摸的y值对应的是索引中的哪个字母,然后回调了监听器;而在ACTION_UP
中重置了lastSelected
,回调了监听器。
这样,我们就把QuickIndexBar
写好了,关于QuickIndexBar
使用的代码就不贴出来了,太长了。如果有需要,可以下载下面的Demo,里面都有注释。Demo的效果图如下:
好了,今天就到这里了。have fun!
源码下载:
GitHub:
v1.5.2