package com.lqr.wechat.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import com.lqr.wechat.R;
/**
* @创建者 CSDN_LQR
* @描述 快速导航条
*/
public class QuickIndexBar extends View {
private Paint mPaint;
private float mTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, getResources().getDisplayMetrics());
private static final String[] LETTERS = new String[]{
"↑", "☆", "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", "#"
};
private int mCellWidth;
private float mCellHeight;
private int mTouchIndex = -1;//用于记录当前触摸的索引值
//暴露一个字母的监听
public interface OnLetterUpdateListener {
void onLetterUpdate(String letter);
void onLetterCancel();
}
private OnLetterUpdateListener mListener;
public OnLetterUpdateListener getOnLetterUpdateListener() {
return mListener;
}
public void setOnLetterUpdateListener(OnLetterUpdateListener listener) {
mListener = listener;
}
public QuickIndexBar(Context context) {
this(context, null);
}
public QuickIndexBar(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public QuickIndexBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(getResources().getColor(R.color.side_bar));
mPaint.setTextSize(mTextSize);
//setBackgroundColor(Color.WHITE);
//mPaint.setTypeface(Typeface.DEFAULT_BOLD);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//获取单元格的宽度和高度
mCellWidth = getMeasuredWidth();
mCellHeight = getMeasuredHeight() * 1.0f / LETTERS.length;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
setBackgroundColor(Color.TRANSPARENT);
for (int i = 0; i < LETTERS.length; i++) {
String text = LETTERS[i];
//计算坐标
//x坐标为单元格宽度的一半 减去 文字宽度的一半
int x = (int) (mCellWidth / 2.0f - mPaint.measureText(text) / 2.0f);
Rect bounds = new Rect();
mPaint.getTextBounds(text, 0, text.length(), bounds);
//文本的高度
int textHeight = bounds.height();
//y坐标为单元格高度的一半 + 文字高度的一半 + 上面有多少个单元格的高度(index * mCellHeight)
int y = (int) (mCellHeight / 2.0f + textHeight / 2.0f + i * mCellHeight);
//mPaint.setColor(mTouchIndex == i ? Color.GRAY : Color.WHITE);//被选择到的字母变成灰色
//绘制文本A-Z,此处的x,y坐标是字母左上方的坐标
canvas.drawText(text, x, y, mPaint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int index = -1;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
index = (int) (event.getY() / mCellHeight);// y值/每个单元格的高度 = 当前单元格的索引
if (index >= 0 && index < LETTERS.length) {
if (index != mTouchIndex) {
if (mListener != null) {
mListener.onLetterUpdate(LETTERS[index]);
mTouchIndex = index;
}
}
}
setBackgroundColor(getResources().getColor(R.color.side_bar_pressed));
break;
case MotionEvent.ACTION_MOVE:
index = (int) (event.getY() / mCellHeight);
if (index >= 0 && index < LETTERS.length) {
if (index != mTouchIndex) {
if (mListener != null) {
mListener.onLetterUpdate(LETTERS[index]);
mTouchIndex = index;
}
}
}
setBackgroundColor(getResources().getColor(R.color.side_bar_pressed));
break;
case MotionEvent.ACTION_UP:
mTouchIndex = -1;
if (mListener != null) {
mListener.onLetterCancel();
}
setBackgroundColor(Color.TRANSPARENT);
break;
}
// invalidate();//重新调用onDraw方法实现选中的字母更改颜色
return true;
}
}