说到android的联系人的快速索引,很快就能想到系统自带的快速索引效果,而且现在很多主流的应用都有用到,如QQ的通讯录,微信的通讯录等等。
要想实现快速索引的效果,我们先来理下其实现原理:
首先,我们需要定义一个自定义的控件,得到控件(自定义控件SlideBar)的总高度与宽度,通过SlideBar控件的总高度算出从A~Z(一般最后都有个#)每个字符的需要的高度,再通过循环偏移单个字符高度来画出每个字符,这样第一步就完成了,接着我们要想象下,当我们触摸手机来滑动快速索引的时候,控件变化的原理,在这里最重要的一点就是计算出我们触摸手机时,当前位置的索引(通过当前触摸手机所在的Y坐标除以SlideBar的总高度得出触摸位置所占等分,然后乘以字符的总个数得出当前索引),并有个监听回调提供出去,然后再在画字符的时候根据当前触摸的索引位置来画出触摸时的效果,这样A~Z快速索引自定义控件原理就算基本完成了,然后获取获取手机联系人通过监听回调的索引的字符与联系人首字母的字符做匹配就可以实现联系人的快速索引了。
理解了其原理实现起来就简单了,仔细观察QQ通讯录的快速索引,会发现它的控件正常(非触摸)时和触摸时用的是两张图片切换,不过实现原理也一样啦,只不过省掉了话字母那一段流程,改成画图片而已。还有,我看到Miui系统的自带联系人快速索引效果也蛮好看的,它是已一个圆形背景来标识当前选中字母所在位置的。
下面是最近写的一个A~Z快速索引的效果,那个圆形背景风格的跟Miui的还是有点区别,滑动时非平滑滑动,暂时有四种风格,后续想到其他风格的可能会再添加,并且文本的字体大小,颜色,背景都可以自己随意设置。
先看下效果图:
快速索引控件核心实现代码如下:
/**
* A~Z快速索引
* @author Jenly <jenly1314@gmail.com>
*/
public class SlideBar extends View{
/** 画笔 */
private Paint paint = new Paint();
/** 选中的字母索引 */
private int index = -1;
/** 字母默认颜色 */
private int defaultColor = Color.BLACK;
/** 字母选中颜色 */
private int chooseColor = Color.MAGENTA;
/** 选中背景颜色 */
private int chooseBackgroundColor = Color.LTGRAY;
/** 是否触摸 */
private boolean isTouch;
/** 字母字体大小 */
private int textSize;
/** 字母改变监听 */
private OnTouchLetterChangeListenner onTouchLetterChangeListenner;
/** 字母数组 */
public String[] letters = { "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z" ,"#"};
private STYLE chooseStyle = STYLE.DEFAULT;
/**
* 选中时背景风格
*/
public enum STYLE {
/**
* 默认:椭圆全背景
*/
DEFAULT,
/**
* 无
*/
NONE,
/**
* 圆形
*/
CIRCLE,
/**
* 拉伸
*/
STRETCH
}
public SlideBar(Context context) {
super(context);
init(context, null);
}
public SlideBar(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public SlideBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context,AttributeSet attrs){
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.SlideBar);
textSize = a.getDimensionPixelSize(R.styleable.SlideBar_android_textSize, (int)TypedValue.applyDimension(16, TypedValue.COMPLEX_UNIT_SP, getResources().getDisplayMetrics()));
defaultColor = a.getColor(R.styleable.SlideBar_android_textColor,Color.BLACK);
chooseColor = a.getColor(R.styleable.SlideBar_slideBar_chooseTextColor, Color.MAGENTA);
chooseBackgroundColor = a.getColor(R.styleable.SlideBar_slideBar_chooseBackgroundColor, Color.LTGRAY);
a.recycle();
}
/**
* 设置字母默认色
* @param color
*/
public void setDefaultColor(int color){
this.defaultColor = color;
}
/**
* 设置字母选中色
* @param color
*/
public void setChooseColor(int color){
this.chooseColor = color;
}
/**
* 设置选中时控件的背景色
* @param color
*/
public void setChooseBacegroundColor(int color){
this.chooseBackgroundColor = color;
}
/**
* 设置选中时控件的风格
* @param style
*/
public void setChooseStyle(STYLE style){
this.chooseStyle = style;
}
/**
* 文本字体大小 单位:dp
* @param size
*/
public void setTextSize(int size){
this.textSize = size;
}
/**
* 设置字母改变回调监听
* @param onTouchLetterChangeListenner
*/
public void setOnTouchLetterChangeListenner(OnTouchLetterChangeListenner onTouchLetterChangeListenner){
this.onTouchLetterChangeListenner = onTouchLetterChangeListenner;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
//字母的个数
int len = letters.length;
//单个字母的高度
int singleHeight = height/(len);
if(isTouch && chooseBackgroundColor!=Color.TRANSPARENT && chooseStyle!=STYLE.NONE){ //触摸时画出背景色
paint.setAntiAlias(true);
paint.setColor(chooseBackgroundColor);
if(chooseStyle == STYLE.CIRCLE){//选中 圆形背景效果
float maxVaule = Math.max(width, singleHeight);
float minVaule = Math.min(width, singleHeight);
canvas.drawArc(new RectF((maxVaule-minVaule)/2, singleHeight*(index), singleHeight+(maxVaule-minVaule)/2, singleHeight*(index)+singleHeight), 0, 360,true, paint);
}else if(chooseStyle == STYLE.STRETCH){//选中背景拉伸效果
canvas.drawArc(new RectF(0, 0, width, singleHeight*index), 0, 360,true, paint);
}else{//默认:全椭圆背景效果
canvas.drawArc(new RectF(0, 0, width, singleHeight), 180, 180,true, paint);
canvas.drawRect(new RectF(0, singleHeight/2, width, height-singleHeight/2), paint);
canvas.drawArc(new RectF(0, height-singleHeight, width, height), 0, 180,true, paint);
}
}
//画字母
for(int i=0;i<len;i++){
// 设置字体格式
paint.setTypeface(Typeface.DEFAULT);
paint.setTextAlign(Align.CENTER);
// 抗锯齿
paint.setAntiAlias(true);
// 设置字体大小
paint.setTextSize(textSize);
if(i == index){//选中时的画笔颜色
paint.setColor(chooseColor);
}else{//未选中时的画笔颜色
paint.setColor(defaultColor);
}
if(isTouch){//触摸时设为粗体字
paint.setFakeBoldText(true);
}else{
paint.setFakeBoldText(false);
}
//要画的字母的x,y坐标
float x = width/2;
float y = singleHeight*(i+1)- paint.measureText(letters[i])/2;
//画字母
canvas.drawText(letters[i], x, y, paint);
//重置画笔
paint.reset();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
//当前选中字母的索引
final int index = (int)(event.getY()/getHeight() * letters.length);
//老的索引
int oldIndex = this.index;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isTouch = true;
if(index!=oldIndex && index>=0 && index<letters.length){
this.index = index;
if(onTouchLetterChangeListenner!=null){//监听回调
onTouchLetterChangeListenner.onTouchLetterChange(isTouch, letters[index]);
}
invalidate();
}
break;
case MotionEvent.ACTION_MOVE:
isTouch = true;
if(index!=oldIndex && index>=0 && index<letters.length){
this.index = index;
if(onTouchLetterChangeListenner!=null){//监听回调
onTouchLetterChangeListenner.onTouchLetterChange(isTouch, letters[index]);
}
invalidate();
}
break;
case MotionEvent.ACTION_UP:
isTouch = false;
if(index>=0 && index<letters.length){
if(onTouchLetterChangeListenner!=null){//监听回调
onTouchLetterChangeListenner.onTouchLetterChange(isTouch, letters[index]);
}
}
this.index = -1;
invalidate();
break;
default:
break;
}
return true;
}
/**
* 字母改变监听接口
*/
public interface OnTouchLetterChangeListenner {
void onTouchLetterChange(boolean isTouch, String letter);
}
}
获取最新源码请戳:SlideBar
分享到:
相关推荐
在处理大量数据时,为了方便用户快速定位和查找,通常会实现A-Z字母排序和过滤搜索功能。本教程将详细介绍如何在ListView中实现这些特性,并结合汉字转成拼音的处理。 首先,我们创建一个名为`SortModel`的实体类,...
在Android开发中,创建一个联系人A-Z索引列表是一项常见的需求,这使得用户能够快速地定位和查找特定联系人。这种功能广泛应用于各种通讯录应用或者任何涉及到大量需分类数据的应用。标题“Android-联系人A-Z索引...
本示例"融合了A~Z快速索引和侧滑菜单的ListVeiw的demo"旨在展示如何在ListView中集成两种常见的增强用户体验的功能:字母快速索引和侧滑菜单。这两种功能能够使用户更高效地浏览和操作数据。 1. **字母快速索引**...
在Android开发中,"安卓A-Z字母排序索引相关-ListviewFilter实现右侧边栏添加字母索引"是一个常见的需求,通常用于应用的联系人列表或者任何需要按字母顺序快速定位的数据展示。这个主题涉及到的主要知识点包括...
通过以上步骤,我们可以构建一个功能完善的Android联系人列表界面,它具备了仿iPhone的视觉效果,高效的搜索功能以及A~Z字母索引,提升了用户体验。在实际项目中,可以根据具体需求进行调整和扩展,例如添加联系人...
这个实例主要关注如何实现字母索引(A~Z)的拼音侧边栏检索功能,使得用户可以快速定位到联系人的姓氏。以下将详细介绍这一功能的实现步骤和关键技术点。 1. **数据结构设计** 首先,我们需要一个数据结构来存储...
在Android开发中,创建一个类似手机通讯录的应用是常见的任务,其中包括一个重要功能:按字母顺序对联系人进行索引和排序。本示例代码着重展示了如何实现这一特性,让用户能够快速定位到特定联系人的名字。这里我们...
在Android开发中,实现“android 仿联系人索引带索引推移动画”涉及到多个关键技术点,包括自定义View、动画处理、触摸事件处理以及数据加载与展示。以下将详细解析这一功能的实现过程。 1. 自定义View:首先,我们...
在这个案例中,我们用到了一个名为`SortListView`的自定义`ListView`,它可能包含了一个特殊的头部,这个头部可以显示A到Z的字母,用户可以通过点击这些字母快速跳转到对应的联系人列表部分。此外,每个`ListView`项...
"新提醒”获取手机联系人并按字母排序,且可根据字母右侧A~Z检索-Android开发源码下载-eoe Android开发者社区_Android开发论坛 - Powered by Discuz!.pdf文件可能是项目的文档或教程,介绍了如何运行和使用该项目,...
这种功能在大型数据集的列表中非常实用,例如联系人应用或应用商店,用户可以通过字母导航迅速找到目标项。下面我们将详细探讨这一功能的实现原理和关键知识点。 1. **ListView基础**:ListView是一个可滚动的视图...
仿Android联系人SideBar排序,根据拼音A-Z字母快速导航联系人姓名,以及输入搜索条件过滤,显示姓名的文字图片,添加挤压动画.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
"ListView右侧A~Z排列实现快速定位"是一个常见的优化手段,它可以帮助用户快速找到所需的信息,尤其在处理大量联系人或者目录类应用时,这样的功能显得尤为重要。下面将详细阐述如何实现这个功能。 首先,我们需要...
这个"Android 获取手机联系人并按字母排序,且可根据字母右侧A~Z检索"的项目,是一个适用于毕业设计学习的源码示例,它覆盖了Android开发中的多个关键知识点。以下将详细介绍这些技术要点: 1. **Android权限管理**...
在Android开发中,创建一个类似手机通讯录的A-Z侧边索引查询功能是一项常见的需求。这个项目"Android 仿通讯录A-Z侧边索引查询 LetterListView androidstudio"是针对这一需求的具体实现,它使用了Android Studio作为...
快速索引功能在Android联系人应用中表现为字母栏,用户可以通过点击字母A到Z来快速定位到以该字母开头的联系人。这个功能提高了用户体验,减少了在大量联系人中寻找特定联系人的难度。 1. **快速索引的基本原理**:...
在Android系统中,联系人应用是用户日常交互的重要部分,其功能包括添加、编辑和查找联系人等。本文将深入探讨如何实现一个全特效的联系人应用,特别是字母表快速滚动的功能,使得用户能快速定位到特定联系人的名字...
这个“Android 联系人快速索引源码.zip”压缩包文件很可能是提供了一个实现快速查找联系人功能的源代码示例。在Android开发中,为联系人应用创建高效的索引是非常关键的,因为它直接影响到用户体验。下面,我们将...
此外,为了提升用户体验,我们还可以添加一个侧滑菜单或底部导航栏,展示A~Z的所有字母,用户点击后会跳转至对应的联系人列表。这个过程涉及到了Activity的生命周期管理、Fragment的使用以及事件监听等Android基础...
在Android开发中,创建一个可滚动的字母索引列表,以快速定位联系人,是一项常见的需求。本项目实现了“android手机联系人,字母索引列表,实现联动”的功能,涉及了多个关键知识点,包括自定义View、ListView数据...