自定义字母导航

下面实现一个简单的字母导航,效果不如意的可以根据自己的需求更改,小左没有提供相应的自定义属性和接口。

效果图如下:



源码:

public class NavigationView extends View{
    private Paint mPaint;//画笔
    private String mText = "#ABCDEFGHIGKLMNOPQRSTUVWXYZ#";//显示的字母符号
    private int mChoose = -1;//选中的字母
    private float mCharSize = 30f;//字母默认大小
    private boolean mShowBkg = false;//触摸显示背景
    private boolean mShowTip = true;//默认显示选中的字母
    //弹框
    private PopupWindow mPopupWindow;
    private TextView mPopupText;
    private int mScreenWidth;
    private Drawable mTipBgDrawable;

    private OnItemClickListener mOnItemClickListener;

    public NavigationView(Context context) {
        this(context, null);
    }
    public NavigationView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public NavigationView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initData(context);
    }

    private void initData(Context context) {
        mPaint = new Paint();
        mScreenWidth = context.getResources().getDisplayMetrics().widthPixels;
    }

    public int getSize() {
        return mText == null ? 0 : mText.length();
    }

    public void setTip(boolean flag) {
        mShowTip = flag;
    }

    public void setTipBackground(Drawable drawable) {
        mTipBgDrawable = drawable;
    }
    //绘制
    @Override
    protected void onDraw(Canvas canvas) {
        if (mShowBkg) {
            canvas.drawColor(Color.parseColor("#4d000000"));
        } else {
            canvas.drawColor(Color.parseColor("#00000000"));
        }
        int height = getHeight();
        int width = getWidth();
        int singleHeight = height / mText.length();
        for (int i = 0; i < mText.length(); i++) {
            mPaint.setColor(Color.parseColor("#ff555555"));
            mPaint.setTextSize(mCharSize);
            mPaint.setFakeBoldText(true);
            mPaint.setAntiAlias(true);
            if (i == mChoose) {
                mPaint.setColor(Color.parseColor("#3399ff"));
            }
            float xPos = width / 2 - mPaint.measureText(String.valueOf(mText.charAt(i))) / 2;
            float yPos = singleHeight * i + singleHeight;
            canvas.drawText(String.valueOf(mText.charAt(i)), xPos, yPos, mPaint);
            mPaint.reset();
        }
    }

    //触摸
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        final int action = event.getAction();
        final float y = event.getY();
        final int oldChoose = mChoose;
        final int c = (int) (y / getHeight() * mText.length());

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                mShowBkg = true;
                if (oldChoose != c) {
                    if (c >= 0 && c < mText.length()) {
                        performItemClicked(c);
                        mChoose = c;
                        invalidate();
                    }
                }

                break;
            case MotionEvent.ACTION_MOVE:
                if (oldChoose != c) {
                    if (c >= 0 && c < mText.length()) {
                        performItemClicked(c);
                        mChoose = c;
                        invalidate();
                    }
                }
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                mShowBkg = false;
                mChoose = -1;
                dismissPopup();
                invalidate();
                break;
        }
        return true;
    }

    private void performItemClicked(int item) {
        if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(item, String.valueOf(mText.charAt(item)));
        }
        if (mShowTip) {
            showPopup(item);
        }
    }

    private void showPopup(int item) {
        if (mPopupWindow == null) {
            mPopupText = new TextView(getContext());
            if (mTipBgDrawable != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                mPopupText.setBackground(mTipBgDrawable);
            }else {
                mPopupText.setBackgroundColor(Color.WHITE);
            }
            mPopupText.setTextColor(Color.CYAN);
            mPopupText.setTextSize(mCharSize);
            mPopupText.setGravity(Gravity.CENTER);
            mPopupWindow = new PopupWindow(mPopupText, mScreenWidth / 4, mScreenWidth / 4);
        }

        String text = String.valueOf(mText.charAt(item));
        mPopupText.setText(text);
        if (mPopupWindow.isShowing()) {
            mPopupWindow.update();
        } else {
            mPopupWindow.showAtLocation(getRootView(), Gravity.CENTER, 0, 0);
        }
    }

    private void dismissPopup() {
        if (mPopupWindow != null) {
            mPopupWindow.dismiss();
        }
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mOnItemClickListener = listener;
    }

    public interface OnItemClickListener {
        /**
         * @param index 字母下标
         * @param s     选择的字母
         */
        void onItemClick(int index, String s);
    }
}
吐舌头到此,代码已完成。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值