需要做了一个仿微信侧边烂搜索界面的View,这种简单的控件如果去github上的话,很麻烦,所以就自己写了一个,代码很简单,不多说,上代码
public class SideBar extends View {
private String[] mTexts = 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 Paint mCommonPaint;
private int mChoose = -1;
private Paint mChoosePaint;
private GestureDetector mGestureDetector;
private int mTextHeight;
public SideBar(Context context) {
super(context);
init();
}
public SideBar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public SideBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mCommonPaint = new Paint();
mCommonPaint.setAntiAlias(true); //抗锯齿
mCommonPaint.setTextSize(ScreenUtil.dip2px(10));
mCommonPaint.setColor(Color.parseColor("#888888"));
mCommonPaint.setTypeface(Typeface.MONOSPACE); //设置字体
mChoosePaint = new Paint();
mChoosePaint.setAntiAlias(true);
mChoosePaint.setTextSize(ScreenUtil.dip2px(10));
mChoosePaint.setColor(Color.parseColor("#333333"));
mChoosePaint.setTypeface(Typeface.MONOSPACE);
mGestureDetector = new GestureDetector(getContext(), mOnGestureListener);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < mTexts.length; i++) {
String text = mTexts[i];
float x = getMeasuredWidth() / 2 - mCommonPaint.measureText(text) / 2; //measureText测量字体大小
if (mChoose == i) {
canvas.drawText(text, x, i * mTextHeight + mTextHeight + getPaddingTop(), mChoosePaint);
} else {
canvas.drawText(text, x, i * mTextHeight + mTextHeight + getPaddingTop(), mCommonPaint);
}
}
}
private GestureDetector.SimpleOnGestureListener mOnGestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
int y = (int) e.getY() - getPaddingTop();
mChoose = y / mTextHeight;
invalidate();
if (mOnSideChooseListening != null) {
mOnSideChooseListening.onChooseListener(mChoose, mTexts[mChoose]);
}
return super.onSingleTapUp(e);
}
};
@Override
public boolean onTouchEvent(MotionEvent event) {
mGestureDetector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
setBackgroundColor(Color.parseColor("#88888888"));
break;
case MotionEvent.ACTION_UP:
setBackgroundColor(Color.TRANSPARENT);
break;
}
return true;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//需要考虑padding
mTextHeight = (getMeasuredHeight() - getPaddingTop() - getPaddingBottom()) / mTexts.length;
}
public void setTextSize(int size) {
mCommonPaint.setTextSize(size);
mChoosePaint.setTextSize(size);
}
public interface OnSideChooseListening {
void onChooseListener(int choose, String text);
}
private OnSideChooseListening mOnSideChooseListening;
public void setOnSideChooseListening(OnSideChooseListening onSideChooseListening) {
mOnSideChooseListening = onSideChooseListening;
}
}