在安卓开发中经常用到索引来快速定位联系人或者其他例如listview的某个item,先看看效果图
要实现的就是右侧的A-Z的索引功能
右侧的索引就是一个自定义view
public class MySliderBar extends View {
private onTouchChangedListener listener;
public MySliderBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
private int singleHeight;
// 是否显示背景
private boolean showBg = false;
// 当前选中的字母
private int choose = -1;
//定义一个画笔
private Paint paint = new Paint();
//索引的字母
private String[] letters = { "#", "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" };
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
int height=getHeight();
int width=getWidth();
//计算单个字母的高度
singleHeight=height/letters.length;
if(showBg){
canvas.drawColor(Color.parseColor("#55000000"));
}
//遍历画出索引字母
for(int i=0;i<letters.length;i++){
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setTextSize(25f);
if(i==choose){
paint.setFakeBoldText(true);
paint.setColor(Color.RED);
}
float posX=width/2-paint.measureText(letters[i])/2;
float posY=singleHeight*(i+1);
canvas.drawText(letters[i], posX, posY, paint);
paint.reset();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
//当前选中字母索引
int index=-1;
index=(int) (event.getY()/getHeight()*letters.length);
Log.e("index", index+"");
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
showBg=true;
if(listener!=null&&index<letters.length&&index>0){
choose=index;
listener.onTouchChanged(letters[index], showBg);
}
invalidate();
break;
case MotionEvent.ACTION_MOVE:
if(listener!=null&&index<letters.length&&index>0){
listener.onTouchChanged(letters[index], showBg);
choose=index;
}
invalidate();
break;
case MotionEvent.ACTION_UP:
showBg=false;
choose=-1;
if(listener!=null){
if(index<=0){
listener.onTouchChanged("A", showBg);
}else if(index>=letters.length){
listener.onTouchChanged("Z", showBg);
}else {
listener.onTouchChanged(letters[index], showBg);
}
}
invalidate();
break;
}
return true;
}
public void setOnTouchChangedListener(onTouchChangedListener listener){
this.listener=listener;
}
//定义回调接口
public interface onTouchChangedListener{
public void onTouchChanged(String currentLetter,Boolean showBg);
}
}
代码大部分都带有注释了,也比较容易实现。下面看看xml布局
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@drawable/line3" />
<TextView
android:id="@+id/float_letter"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="#F88701"
android:gravity="center"
android:textSize="40sp"
android:visibility="gone" />
<com.example.tuan.widget.MySliderBar
android:id="@+id/slideBar"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom" />
</FrameLayout>
最后就是回调接口的使用了
利用回调,给索引view添加监听
mSliderBar.setOnTouchChangedListener(new onTouchChangedListener() {
@Override
public void onTouchChanged(final String currentLetter, Boolean showBg) {
float_letter.setText(currentLetter);
if(showBg){
float_letter.setVisibility(View.VISIBLE);
}else {
float_letter.postDelayed(new Runnable() {
@Override
public void run() {
float_letter.setVisibility(View.GONE);
}
}, 800);
}
int selection= array.indexOf(currentLetter);
mListView.setSelection(selection);
}
});
这样,自定义的索引就完成了