仿美团快速索引View

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;
    }
}

猜你喜欢

转载自blog.csdn.net/Luffy0719/article/details/88354788