<span style="font-family: Arial, Helvetica, sans-serif;">LetterView.java</span>
public class LetterView extends View {// 1.0继承View
public LetterView(Context context) {// 1.1实现构造函数
super(context);
}
public LetterView(Context context, AttributeSet attrs) {// 1.2实现构造函数
super(context, attrs);
}
private static String[] letter = {"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.3 26个字母导航条
private OnTouchingLetterChangedListener onTouchingLetterChangedListener;// 1.4监听事件
private Paint paint;// 1.5画笔
private TextView mTextDialog;// 1.6表示某个字母被选择,弹出显示
public void setmTextDialog(TextView mTextDialog) {// 1.7表示某个字母被选择,弹出显示--提供Set方法
this.mTextDialog = mTextDialog;
}
protected void onDraw(Canvas canvas) {// 2.0重写该方法,类似一个黑板,在里面绘制东西
super.onDraw(canvas);
int width = getWidth();// 2.1获取View的高度和宽度
int height = getHeight();
int letterLength = letter.length;// 2.2字母数量
int letterHeight = height / letterLength;// 2.3每个字母的高度
paint = new Paint();// 2.4初始化画笔
for (int i = 0; i < letterLength; i++) {
paint.setTextSize(letterHeight * 4 / 5);
paint.setAntiAlias(true);// 设置画笔是否使用抗锯齿(使用会消耗较大资源)
float xPos = width - letterHeight;// 靠近屏幕右边减去字母的高度
float yPos = letterHeight * i + letterHeight;
canvas.drawText(letter[i], xPos, yPos, paint); // 2.4开始绘制
// paint.reset(); // 重置画笔
}
}
public boolean dispatchTouchEvent(MotionEvent event) {// 3.0监听事件
int action = event.getAction();// 3.1获取事件类型
float yPosCurrent = event.getY();// 获取被点击时的Y坐标
int letterCurrent = (int) (yPosCurrent / getHeight() * letter.length);// 计算被点击字母的位置
OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
// 例如点击的是中间位置, 50/100*字母个数...得到的是中间字母位置
switch (action) {
case MotionEvent.ACTION_UP :// 当手指抬起的时候
setBackgroundDrawable(new ColorDrawable(0x00000000));
mTextDialog.setVisibility(View.GONE);
// invalidate();// 刷新View,调用此方法后,系统会自动回调onDraw方法,重新描绘控件
break;
default :// 当触摸或点击,长按
setBackgroundDrawable(new ColorDrawable(0x551245ff));
if (letterCurrent >= 0 && letterCurrent < letter.length) {
if (listener != null) {
listener.onTouchingLetterChanged(letter[letterCurrent]);
}
mTextDialog.setText(letter[letterCurrent]);
mTextDialog.setVisibility(View.VISIBLE);
}
// invalidate();
break;
}
return true;// 3.0返回true,不然会调用系统的回调
}
// 这是接口对外公开的方法
public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
}
// 如果想要监听导航条的操作,那么需要自定义一个导航条监听事件,回调
public interface OnTouchingLetterChangedListener {
public void onTouchingLetterChanged(String letter);
}
}
</pre><pre name="code" class="java"><pre name="code" class="java">public class MainActivity extends Activity {
private Context context;
private LetterView letterview;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
setContentView(R.layout.activity_main);
InitLetterView();
}
private void InitLetterView() {
textView = (TextView) this.findViewById(R.id.textView);
letterview = (LetterView) this.findViewById(R.id.letterview);
letterview.setmTextDialog(textView);
}
}