Android 自定义View——联系人右侧字母索引
2017-11-08 14:39
441 查看
现在很多app里面都有侧边栏字母索引列表,看着效果很炫酷,其实不难,那我们现在也来一起自定义一个侧边栏索引列表。
没图说个毛
GIF图:------------------------------------开始撸代码-------------------------------------一.首先我们先来写右侧的侧边栏
public class SideBar extends View { /*绘制的列表导航字母*/ private String words[] = {"↑", "☆", "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 Paint wordsPaint; /*按下字母背景画笔*/ private Paint bgPaint; /*每一个item的宽度*/ private int wordWidth; /*每一个item的高度*/ private int wordHeight; /*手指按下的字母索引*/ private int touchIndex = -1; /*手指按下的字母改变接口*/ private onWordsChangeListener listener; private TextView mTextDialog;
获取到控件的宽高,计算出每个item的宽高
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); wordWidth = getMeasuredWidth(); int height = getMeasuredHeight(); wordHeight = height / words.length; }
开始画字母列表
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (int i = 0; i < words.length; i++) { wordsPaint.setTypeface(Typeface.DEFAULT); wordsPaint.setAntiAlias(true); wordsPaint.setTextSize(DensityUtils.dp2px(getContext(), 14)); // 是按下的字母则绘制背景 if (touchIndex == i) { canvas.drawCircle(wordWidth / 2, wordHeight / 2 + i * wordHeight, wordHeight / 2, bgPaint); wordsPaint.setColor(Color.WHITE); } else { wordsPaint.setColor(Color.parseColor("#666666")); } //获取文字的宽高 Rect rect = new Rect(); wordsPaint.getTextBounds(words[i], 0, words[i].length(), rect); //得到文字的X坐标 float wordX = wordWidth / 2 - wordsPaint.measureText(words[i]) / 2; float wordY = wordHeight / 2 + rect.height() / 2 + wordHeight * i; canvas.drawText(words[i], wordX, wordY, wordsPaint); wordsPaint.reset(); } }
二.处理触摸事件:
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN | MotionEvent.ACTION_MOVE: float y = event.getY(); //关键点===获得我们按下的是那个索引(字母) int index = (int) (y / wordHeight); touchIndex = index; //防止数组越界 if (listener != null && 0 <= touchIndex && touchIndex <= words.length - 1) { //回调按下的字母 listener.wordsChange(words[touchIndex]); invalidate(); if (mTextDialog != null) { mTextDialog.setText(words[index]); mTextDialog.setVisibility(View.VISIBLE); } } break; case MotionEvent.ACTION_UP: touchIndex = -1; invalidate(); if (mTextDialog != null) { mTextDialog.setVisibility(View.GONE); } break; } return true; }
/*手指按下了哪个字母的回调接口*/ public interface onWordsChangeListener { void wordsChange(String words); }
三.listview列表:将汉字转为拼音排序
List<Person> mSortList = new ArrayList<Person>(); for (int i = 0; i < date.length; i++) { Person sortModel = new Person(); sortModel.setName(date[i]); //汉字转换成拼音 String pinyin = characterParser.getSelling(date[i]); String sortString = pinyin.substring(0, 1).toUpperCase(); // 正则表达式,判断首字母是否是英文字母 if (sortString.matches("[A-Z]")) { sortModel.setLetter(sortString.toUpperCase()); } else { sortModel.setLetter("#"); } mSortList.add(sortModel); }
Collections.sort(mSortList, pinyinComparator);
sideBar.setOnWordsChangeListener(new SideBar.onWordsChangeListener() { @Override public void wordsChange(String words) { if ("↑".equals(words)) { listview.setSelection(0); } else if ("☆".equals(words)) { listview.setSelection(1); } else { //该字母首次出现的位置 int position = myAdapter.getPositionForSection(words.charAt(0)); if (position != -1) { listview.setSelection(position+2); } } } });
好啦! 大工告成,是不是很简单呢?嘿嘿。。。
==============源码下载============
相关文章推荐
- Android自定义View——实现联系人列表字母索引
- Android获取通讯录联系人,右侧字母滑动索引
- android自定义view 右侧字母导航
- 【Android】自定义View快速建立字母索引列表
- Android自定义View之用观察者模式写自定义监听事件以及常用竖直型字母索引栏的写法
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- Android 仿联系人菜单,带字母索引,顶部挤压动画,recyclerview实现联系人页面
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- Android获取通讯录联系人,右侧字母滑动索引
- 【Android 仿微信通讯录 导航分组列表-下】自定义View为RecyclerView打造右侧索引导航栏IndexBar
- Android 首字母分组快速索引 自定义WaveSiderBarView
- android自定义view 二 联系人分类索引
- Android自定义View实现通讯录字母索引(仿微信通讯录)
- 城市列表自定义view(右侧索引字母)
- 微信联系人右侧字母滑动索引
- 自定义UITableView的右侧索引
- Android自定义控件5----继承View通讯录索引功能之1初始化显示字母列表
- Android 仿微信联系人Demo(自定义View,Viewgroup)
- Android实现字母索引查找地名、联系人(二)
- Android&java的成长之路之四(自定义字母索引)