前言 因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果。本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太复杂了,有的简单是
前言
因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果。本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太复杂了,有的简单是简单,但是不符合我的要求,所以我就来个整合,把复杂性和简单性合二为一。
实现
先来看效果图吧:
要点分析
要实现这样的效果需要考虑下面的几个问题:
下面我们就解决这几个问题,然后就可以出现上面的效果了。
【第一步】
我们需要先自定义一个类,就叫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); }}
--结束END--
本文标题: android仿微信联系人索引列表功能
本文链接: https://www.lsjlt.com/news/219917.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0