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.text.TextUtils;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.danchexia.bikehero.utils.MyUtils;
import java.util.List;
/**
* @author Created by HP on 2018/6/20.
*/
public class QuickIndexView extends View {
private Paint mPaint;
private int mWidth;
private float mCellHeight;
private int mLastIndes = -1;
private OnTextTouchListener listener;
private List<String> data;
public QuickIndexView(Context context) {
super(context);
init();
}
public QuickIndexView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public QuickIndexView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
/**
* 确定文字的起点、大小,paint的颜色
*/
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.parseColor("#ff9805"));
mPaint.setTextSize(MyUtils.dp2px(getContext(), 13));
//设置文本的起点为终点
mPaint.setTextAlign(Paint.Align.CENTER);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//得到一个格子的大小
mWidth = getMeasuredWidth();
}
/**
* 开始画
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//当前选择的字母为黑色
if (data != null) {
//invalide后,只执行onDraw方法
mCellHeight = getMeasuredHeight() * 1f / data.size();
for (int i = 0; i < data.size(); i++) {
float x = mWidth / 2;
float y = (mCellHeight + getTextHeight(data.get(i))) / 2 + i * mCellHeight;
canvas.drawText(data.get(i), x, y, mPaint);
}
}
}
private float getTextHeight(String text) {
if (!TextUtils.isEmpty(text)) {
Rect rect = new Rect();
mPaint.getTextBounds(text, 0, text.length(), rect);
return rect.height();
}
return 0;
}
/**
* 设置点击字母的监听
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
//判断抬起时的y值是属于哪个字母
float moveY = event.getY();
int index = (int) (moveY / mCellHeight);
if (mLastIndes != index) {
//防止移动时重复在一个字母上移动
if (index >= 0 && index < data.size()) {
if (listener != null) {
listener.onTextTouch(data.get(index));
}
}
}
mLastIndes = index;
break;
case MotionEvent.ACTION_UP:
//重置
mLastIndes = -1;
break;
default:
break;
}
invalidate();
return true;
}
public interface OnTextTouchListener {
/**
* 选中
* @param current 当前选中
* */
void onTextTouch(String current);
}
public void setOnTextTouchListener(OnTextTouchListener listener) {
this.listener = listener;
}
public void setData(List<String> data) {
this.data = data;
}
}