当前位置: 首页 > 工具软件 > SlideBar > 使用案例 >

自定义 右侧导航SlideBar

柳胜
2023-12-01

1,自定义

package com.vily.fanchatdemo.widgt;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import com.hyphenate.util.DensityUtil;
import com.vily.fanchatdemo.R;


/**
 * 创建者:   Leon
 * 创建时间:  2016/10/18 18:02
 * 描述:    TODO
 */
public class SlideBar extends View {
    public static final String TAG = "SlideBar";

    private float mTextSize = 0;

    private static final String[] SECTIONS = {"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 mPaint;

    private int mCurrentIndex = - 1;

    private float mTextBaseline = 0;

    private OnSlideBarChangeListener mOnSlideBarChangeListener;

    public SlideBar(Context context) {
        this(context, null);
    }

    public SlideBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }

    private void initPaint() {
        mPaint = new Paint();
        mPaint.setColor(getResources().getColor(R.color.qq_section_text_color));
        mPaint.setTextAlign(Paint.Align.CENTER);
        mPaint.setTextSize(DensityUtil.sp2px(getContext(), 10));
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mTextSize = h * 1.0f / SECTIONS.length;//计算分配给字符的高度
        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
        float mTextHeight = fontMetrics.descent - fontMetrics.ascent;//获取绘制字符的实际高度
        mTextBaseline = mTextSize / 2 + mTextHeight/2 - fontMetrics.descent;//计算字符居中时的baseline
    }

    @Override
    protected void onDraw(Canvas canvas) {
        float x = getWidth() * 1.0f / 2;
        float baseline = mTextBaseline;
        for(int i = 0; i < SECTIONS.length; i++) {
            canvas.drawText(SECTIONS[i], x, baseline, mPaint);
            baseline += mTextSize;
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                setBackgroundResource(R.drawable.bg_slide_bar);
                notifySectionChange(event);
                break;
            case MotionEvent.ACTION_MOVE:
                notifySectionChange(event);
                break;
            case MotionEvent.ACTION_UP:
                setBackgroundColor(Color.TRANSPARENT);
                if (mOnSlideBarChangeListener != null) {
                    mOnSlideBarChangeListener.onSlidingFinish();
                }
                break;
        }
        return true;
    }

    private void notifySectionChange(MotionEvent event) {
        int index = getTouchIndex(event);
        if (mOnSlideBarChangeListener != null && mCurrentIndex != index) {
            mCurrentIndex = index;
            mOnSlideBarChangeListener.onSectionChange(index, SECTIONS[index]);
        }
    }

    private int getTouchIndex(MotionEvent event) {
        int index = (int) (event.getY() / mTextSize);
        if (index < 0) {
            index = 0;
        } else if (index > SECTIONS.length - 1) {
            index = SECTIONS.length - 1;
        }
        return index;
    }

    public interface OnSlideBarChangeListener{

        void onSectionChange(int index, String section);

        void onSlidingFinish();

    }

    public void setOnSlidingBarChangeListener(OnSlideBarChangeListener l) {
        mOnSlideBarChangeListener = l;
    }
}


2,Java

mSlideBar.setOnSlidingBarChangeListener(this);
    /**
     * 下拉刷新
     */
    @Override
    public void onRefresh() {
        mContactPresenter.refreshContactList();
    }

    /**
     * 右侧下滑框
     *
     * @param index
     * @param section
     */
    @Override
    public void onSectionChange(int index, String section) {
        mSection.setVisibility(View.VISIBLE);
        mSection.setText(section);
        scrollToSection(section);
    }

    /**
     * 滑动结束后 隐藏下滑框
     */
    @Override
    public void onSlidingFinish() {
        mSection.setVisibility(View.GONE);
    }


    /**
     * 右侧下滑框滑动的时候   出现对应的section 的联系人
     *
     * @param section
     */
    private void scrollToSection(String section) {
        int sectionPosition = getSectionPosition(section);
        if (sectionPosition != POSITION_NOT_FOUND) {
            mRecyclerView.smoothScrollToPosition(sectionPosition);
        }
    }

    /**
     * 首字符字母对应的在列表中的位置
     *
     * @param section
     * @return
     */
    private int getSectionPosition(String section) {
        List<ContactListItem> contactListItems = mAdapter.getContactListItems();
        for(int i=0;i<contactListItems.size();i++){
            if(section.equals(contactListItems.get(i).getFirstLetterString())){
                return i;
            }
        }
        return POSITION_NOT_FOUND;

    }


 类似资料: