Android自定义View实现通讯录字母索引(仿微信通讯录)
2019-12-16 21:44:27 来源:易采站长站 作者:于海丽
以上是测量宽度的代码,其测量高度的代码,跟测量宽度的代码大致雷同,就不贴出来了,我会在最后附上源码。
2、实现onDraw(Canvas c)方法,这个方法相信大家都非常熟悉,就是把这些索引的内容绘制到 View 上显示出来,包括选中的时候背景颜色的变化;
@Override
protected void onDraw(Canvas canvas) {
if(mTouched){
canvas.drawColor(0x30000000);
}
for (int i = 0 ; i < mIndex.length ; i ++){
mPaint.setColor(0xff000000);
mPaint.setTextSize(mTextSize * 3.0f / 4.0f);
mPaint.setTypeface(Typeface.DEFAULT) ;
mPaint.getTextBounds(mIndex[i],0,mIndex[i].length(),mTextBound);
float formX = mViewWidth/2.0f - mTextBound.width()/2.0f ;
float formY = mTextSize*i + mTextSize/2.0f + mTextBound.height()/2.0f ;
canvas.drawText(mIndex[i],formX,formY,mPaint);
mPaint.reset();
}
}
我来讲一下 onDraw 方法中大致做了什么事,第一,绘制背景颜色,注意不是一上来就绘制,而是等到有手指触摸的时候就绘制背景颜色,第二,就是绘制索引的内容,这里需要根据当前 View 的宽和高来决定绘制内容的大小,和位置。
3、onTouchEvent(MotionEvent event)方法的实现
@Override
public boolean onTouchEvent(MotionEvent event) {
float y = event.getY() ;
int index = (int) (y / mTextSize);
if(index >= 0 && index < mIndex.length){
Log.v("zgy","======index======="+index) ;
selectItem(index);
}
if(event.getAction() == MotionEvent.ACTION_MOVE){
mTouched = true ;
}else if (event.getAction() == MotionEvent.ACTION_MOVE){
}else {
mFloatView.setVisibility(INVISIBLE);
mTouched = false ;
}
invalidate();
/*过滤点其他触摸事件*/
return true;
}
代码也相对比较简单,首先获取当前触摸的点,根据点的坐标来获取索引的位置,从而拿到索引的位置。
4、到这里其实就已经实现了我们想要的效果,但是这样我们还是无法运用它,这里就需要定义一个回调接口
/*定义一个回调接口*/
public interface OnIndexSelectListener{
/*返回选中的位置,和对应的索引名*/
void onItemSelect(int position, String value) ;
}
回调接口我们放在哪里调用呢,当我们手指按下的时候,这时候其实我们需要确定我们按下的是哪个索引,滑动的时候也是一样,所以,这个没什么好商量的,直接放在onTouchEvent(MotionEvent event)中就可以,
float y = event.getY() ;
int index = (int) (y / mTextSize);
if(index >= 0 && index < mIndex.length){
Log.v("zgy","======index======="+index) ;
selectItem(index);
}
selectItem(int)方法中就是执行的回调方法。
5、实现悬浮框显示已经选中的索引内容













闽公网安备 35020302000061号