import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
public class MyLetterTextView extends View{
public static 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"};
Paint paint;
OnTouchLetterListener listener;
public MyLetterTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
public void setOnTouchLetterListener(OnTouchLetterListener listener){
this.listener = listener;
}
private void initPaint() {
paint = new Paint();
paint.setColor(Color.RED);
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics());
paint.setTextSize(px);//12sp--->px
//paint.setTypeface(Typeface.DEFAULT_BOLD);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//控件的宽度
int width = getWidth();
//控件的高度/27
int height = getHeight()/27;
for(int i=0;i<letters.length;i++){
Rect bounds = new Rect();
paint.getTextBounds(letters[i], 0, letters[i].length(), bounds );
int letterWidth = bounds.width();
int letterHeight = bounds.height();
float x = width/2-letterWidth/2;//控件的宽度/2 - 文字的宽度/2
float y = height/2+letterHeight/2 + height*i;//控件的高度/27/2+文字的高度/2
canvas.drawText(letters[i], x, y, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
setBackgroundColor(Color.LTGRAY);
float y = event.getY();
int idx = (int) ((y*letters.length)/getHeight());
if(idx >=0 && idx<letters.length){
//调用OnTouchLetterListener的onTouchLetter方法
if(listener!=null){
listener.onTouchLetter(letters[idx]);
}
}
break;
default:
setBackgroundColor(Color.TRANSPARENT);
if(listener!=null){
listener.onReleaseLetter();
}
break;
}
return true;
}
public interface OnTouchLetterListener{
void onTouchLetter(String letter);
void onReleaseLetter();
}
}
java代码实现部分
private void initMyLetterTextView() {
letterView.setOnTouchLetterListener(new OnTouchLetterListener() {
@Override
public void onTouchLetter(String letter) {
if (adapter.getPositionForSection(letter.charAt(0))!=-1) {
listView.setSelection(adapter.getPositionForSection(
letter.charAt(0))+1);
}
if (!tv_letter_display.isShown()) {
tv_letter_display.setVisibility(View.VISIBLE);
}
tv_letter_display.setText(letter);
}
@Override
public void onReleaseLetter() {
tv_letter_display.setVisibility(View.INVISIBLE);
}
});
}
onTouchLetter和onReleaseLetter的代码都是自己的业务逻辑,其中adapter的数据集合是有序排列的集合