TextThumbSeekBar2.java 4.59 KB
package com.sw.laryngoscope.widget;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.ViewTreeObserver;
import android.widget.SeekBar;

import com.sw.laryngoscope.R;

@SuppressLint("AppCompatCustomView")
public class TextThumbSeekBar2 extends SeekBar {

    // 画笔
    private Paint mPaint;
    // 进度文字位置信息
    private Rect mProgressTextRect = new Rect();
    // 滑块按钮宽度
    private int mThumbWidth = dp2px(20);

    private int mSeekBarMin;

    private int mHeight;
    private int mWidth;
    private double mOneProgressWidth;
    private float mThumbOffset;
    private int mMaxProgress = 100;
    private int mCurProgress = 0;
    private String mProgressText = "";


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

    public TextThumbSeekBar2(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.seekBarStyle);
        //initData();
    }

    private void initObserver() {
        ViewTreeObserver vto = getViewTreeObserver();
        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                mHeight = getMeasuredHeight();
                mWidth = getMeasuredWidth();
                initData();
                return true;
            }
        });
    }

    private void initData() {
        mPaint = new TextPaint();
        mPaint.setAntiAlias(true);
        mPaint.setTextAlign(Paint.Align.CENTER);
        mPaint.setColor(getResources().getColor(R.color.color_0aede0));
        mPaint.setTextSize(sp2px(18));

        // 如果不设置padding,当滑动到最左边或最右边时,滑块会显示不全
        //setPadding(mThumbWidth / 2, 0, mThumbWidth / 2, 0);

        mThumbOffset = 20 / 2;
        mOneProgressWidth = (double) (mWidth - 2 * mThumbOffset) / (mMaxProgress);
    }

    public TextThumbSeekBar2(Context context, AttributeSet attrs, int defStyleAttr){
        super(context,attrs,defStyleAttr);
        initObserver();
        //initData();
    }

    @Override
    protected synchronized void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        /*String txt = "100%";
        mPaint.getTextBounds(txt, 0, txt.length(), mProgressTextRect);
        canvas.drawText(txt, getWidth() - mProgressTextRect.width(), getHeight() - mProgressTextRect.height() + 10, mPaint);

        // 进度文字位置信息
        String progressText = getProgress() + "%";
        mPaint.getTextBounds(progressText, 0, progressText.length(), mProgressTextRect);

        // 进度百分比
        float progressRatio = (float) getProgress() / getMax();
        // thumb偏移量
        float thumbOffset = (mThumbWidth - mProgressTextRect.width()) / 2 - mThumbWidth * progressRatio;
        float thumbX = getWidth() * progressRatio + thumbOffset;
        //这里修改文字的范围,上或下
        float thumbY = getHeight() / 2f - mProgressTextRect.height() / 2f - dp2px(10);
        int thumbPos = getMeasuredWidth() * getProgress()/getMax() - getThumbOffset();
        canvas.drawText(progressText, thumbPos, thumbY, mPaint);*/


        mCurProgress = getProgress();
        mProgressText = getProgress() + "%";
        float x = (float) (mCurProgress * mOneProgressWidth);
        float textWidth = mPaint.measureText(mProgressText);
        float textOffset = textWidth / 2;
        if (x + textOffset > mWidth - mThumbOffset) {//超过view的右边
            float exWidth = x + textOffset - (mWidth - mThumbOffset);
            x -= exWidth;//避免超过右边
        }
        if (x + mThumbOffset < textOffset) {//超过左边
            float exWidth = textOffset - (x + mThumbOffset);
            x += exWidth;//避免超过左边
        }
        canvas.translate(mThumbOffset, 0);
        canvas.drawText(mProgressText, x, mHeight, mPaint);
    }

    public void setMix(int min){
        mSeekBarMin=min;
    }

    /**
     * dp转px
     *
     * @param dp dp值
     * @return px值
     */
    public int dp2px(float dp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
                getResources().getDisplayMetrics());
    }

    /**
     * sp转px
     *
     * @param sp sp值
     * @return px值
     */
    private int sp2px(float sp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,
                getResources().getDisplayMetrics());
    }
}