有段时间没写博客了,趁今天有空就写了一篇。今天的主题就是仿联系人界面。相信大家在平时都见过,就是可以实现快速索引的侧边栏。比如在美团中选择城市的界面:

我们可以看到在右侧有一个支持快速索引的栏。接下来,我们就要实现这种索引栏。
首先是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: