项目需求,做了这个,现在把我写到代码贴出来把
先贴出布局文件吧,很简单的分分钟写出来。
<com.huangdi.indexlistview.IndexListView
android:layout_width="50dp"
android:id="@+id/index_listview"
android:layout_height="match_parent" />
<TextView
android:layout_width="80dp"
android:layout_centerInParent="true"
android:id="@+id/tv_zimu"
android:textSize="30dp"
android:background="#888888"
android:gravity="center"
android:textColor="#ffffff"
android:visibility="gone"
android:layout_height="100dp" />
接着贴出IndexView
先贴出关键代码绘制方法 onDraw();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for(int i =0 ;i<ZIMU.length;i++){
if(index==i){
//调用了界面重绘后重写绘制字母,这是点击字母以后绘制的,颜色为红色
canvas.drawText(ZIMU[i], 0, ZIMU[i].length(), width / 4, (height / ZIMU.length) * (i + 1) - 3, mClickPaint);
}else{
<span style="white-space:pre"> </span>//这是没有点击的时候状态,默认为gray
canvas.drawText(ZIMU[i], 0, ZIMU[i].length(), width / 4, (height / ZIMU.length) *(i + 1) - 3, mTextPaint);
}
}
}
在贴出初始化画笔
<span style="white-space:pre"> </span>//绘制默认状态的画笔
<span style="white-space:pre"> </span>mTextPaint = new Paint();
<span style="white-space:pre"> </span>//绘制点击以后的画笔
mClickPaint = new Paint();
mTextPaint.setTextSize(ZIMU.length);
mTextPaint.setAntiAlias(true);
mTextPaint.setTextAlign(Paint.Align.CENTER);
mTextPaint.setColor(Color.GRAY);
mTextPaint.setTextScaleX(1.5f);
mClickPaint.setTextSize(ZIMU.length);
mClickPaint.setAntiAlias(true);
mClickPaint.setTextAlign(Paint.Align.CENTER);
mClickPaint.setColor(Color.RED);
mClickPaint.setTextScaleX(1.5f);
贴出点击字母事件的代码ontouch;
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_DOWN: //等到点击的索引然后调用界面重绘 index = (int) (event.getY()/(height/ZIMU.length)); if(onZiMuSelectListener!=null){ onZiMuSelectListener.onItemSelect(index,ZIMU[index]); } invalidate(); return true; } return super.onTouchEvent(event); }
效果图如下package com.huangdi.indexlistview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * 自定义View作为索引 * Created by huangdi on 15/9/30. */ public class IndexListView extends View { private Paint mTextPaint; private Paint mClickPaint; private int width,height; private String ZIMU[] ={"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" }; //点击的索引默认为没有点击所以为-1 private int index = -1; public IndexListView(Context context) { super(context); } public IndexListView(Context context, AttributeSet attrs) { super(context, attrs);mTextPaint = new Paint(); mClickPaint = new Paint(); mTextPaint.setTextSize(ZIMU.length); mTextPaint.setAntiAlias(true); mTextPaint.setTextAlign(Paint.Align.CENTER); mTextPaint.setColor(Color.GRAY); mTextPaint.setTextScaleX(1.5f); mClickPaint.setTextSize(ZIMU.length); mClickPaint.setAntiAlias(true); mClickPaint.setTextAlign(Paint.Align.CENTER); mClickPaint.setColor(Color.RED); mClickPaint.setTextScaleX(1.5f); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //拿到宽度和高度 width = getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec); height = getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec); setMeasuredDimension(width, height); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for(int i =0 ;i<ZIMU.length;i++){ if(index==i){ //调用了界面重绘后重写绘制字母 canvas.drawText(ZIMU[i], 0, ZIMU[i].length(), width / 4, (height / Z IMU.length) * (i + 1) - 3, mClickPaint); }else{ canvas.drawText(ZIMU[i], 0, ZIMU[i].length(), width / 4, (height / Z IMU.length) * (i + 1) - 3, mTextPaint); } } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_DOWN: //等到点击的索引然后调用界面重绘 index = (int) (event.getY()/(height/ZIMU.length)); if(onZiMuSelectListener!=null){ onZiMuSelectListener.onItemSelect(index,ZIMU[index]); } invalidate(); return true; } return super.onTouchEvent(event); } interface OnZiMuSelectListener { void onItemSelect(int index,String zimuStr); }private OnZiMuSelectListener onZiMuSelectListener ; public void setOnZiMuSelectListener(OnZiMuSelectListener onZiMuSelectListener) { this.onZiMuSelectListener = onZiMuSelectListener; } }