前言
因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果。本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太复杂了,有的简单是简单,但是不符合我的要求,所以我就来个整合,把复杂性和简单性合二为一。
实现
先来看效果图吧:
要点分析
要实现这样的效果需要考虑下面的几个问题:
- 右边字母栏的绘制
- 点击效果的实现
- 汉字按A-Z的排序问题
- 正常的Item和字母分隔符的Item的实现
下面我们就解决这几个问题,然后就可以出现上面的效果了。
【第一步】
我们需要先自定义一个类,就叫SlideBar吧,让它继承Button,然后我们覆盖onDraw方法,绘制字母a-z就可以出现右边字母栏的效果了。
看一下源码:
public class SlideBar extends Button{ public interface OnTouchAssortListener{ public void onTouchAssortListener(String s); } // 分类 private static final String[] ASSORT_TEXT = {"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 mPaint = new Paint(); private int mSelectIndex = -1; private OnTouchAssortListener mListener = null; private Activity mAttachActivity; PopupWindow mPopupWindow = null; View layoutView; TextView text; public SlideBar(Context context){ this(context,null); } public SlideBar(Context context, AttributeSet attrs) { this(context, attrs,0); } public SlideBar(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); mAttachActivity = (Activity)context; init(context); } private void init(Context context) { layoutView = LayoutInflater.from(context).inflate(R.layout.alert_dialog_menu_layout, null); text = (TextView) layoutView.findViewById(R.id.content); } public void setOnTouchAssortListener(OnTouchAssortListener listener) { this.mListener = listener; } @Override protected void onDraw(Canvas canvas){ super.onDraw(canvas); int nHeight = getHeight(); int hWidth = getWidth(); int nAssortCount = ASSORT_TEXT.length; int nInterval = nHeight / nAssortCount; for (int i = 0; i < nAssortCount; i++){ mPaint.setAntiAlias(true); // 抗锯齿 mPaint.setTypeface(Typeface.DEFAULT_BOLD); // 默认粗体 mPaint.setColor(Color.parseColor("#5f5f5f")); // 白色 if (i == mSelectIndex){ // 被选择的字母改变颜色和粗体 mPaint.setColor(Color.parseColor("#3399ff")); mPaint.setFakeBoldText(true); mPaint.setTextSize(30); } float xPos = hWidth / 2 - mPaint.measureText(ASSORT_TEXT[i]) / 2; // 计算字母的X坐标 float yPos = nInterval * i + nInterval; // 计算字母的Y坐标 canvas.drawText(ASSORT_TEXT[i], xPos, yPos, mPaint); mPaint.reset(); } } @Override public boolean dispatchTouchEvent(MotionEvent event) { //判断是哪一个字母被点击了 int nIndex = (int) (event.getY() / getHeight() * ASSORT_TEXT.length); if (nIndex >= 0 && nIndex < ASSORT_TEXT.length){ switch (event.getAction()){ case MotionEvent.ACTION_MOVE: // 如果滑动改变 if (mSelectIndex != nIndex){ mSelectIndex = nIndex; showCharacter(ASSORT_TEXT[mSelectIndex]); if (mListener != null){ mListener.onTouchAssortListener(ASSORT_TEXT[mSelectIndex]); } } break; case MotionEvent.ACTION_DOWN: mSelectIndex = nIndex; showCharacter(ASSORT_TEXT[mSelectIndex]); if (mListener != null){ mListener.onTouchAssortListener(ASSORT_TEXT[mSelectIndex]); } break; case MotionEvent.ACTION_UP: disShowCharacter(); mSelectIndex = -1; break; } } else { mSelectIndex = -1; disShowCharacter(); } invalidate(); return true; } private void disShowCharacter() { if (mPopupWindow != null) { mPopupWindow.dismiss(); mPopupWindow=null; } } private void showCharacter(String string){ if (mPopupWindow != null){ text.setText(string); } else{ mPopupWindow = new PopupWindow(layoutView, 100, 100, false); mPopupWindow.showAtLocation(mAttachActivity.getWindow().getDecorView(), Gravity.CENTER, 0, 0); } text.setText(string); }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机android仿微信联系人索引列表功能
后端开发2023-05-30
Android仿微信联系人列表字母侧滑控件
后端开发2023-05-31
Android仿微信联系人按字母排序
后端开发2022-06-06
Android仿微信联系人字母排序效果
后端开发2022-06-06
iOS实现联系人列表功能
后端开发2022-05-24
Android实现可浏览和搜索的联系人列表
后端开发2022-06-06
Android实现屏蔽微信拉黑和删除联系人功能示例
后端开发2022-06-06
Android开发中模仿qq列表信息滑动删除功能
后端开发2022-06-06
Android仿微信发表说说实现拍照、多图上传功能
后端开发2022-06-06
Android仿搜狐视频、微视等列表播放视频功能的详细解析
后端开发2023-05-30
咦!没有更多了?去看看其它编程学习网 内容吧