自定义带刻度的进度条(seekbar)

效果:

layout布局,(“-”,“+”和seekbar布局)




    

    

    

seekbar的style:

自定义布局

package com.hsae.d531mc.systemsetting.util;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;

import com.hsae.d531mc.systemsetting.R;

public class MyOperationProgressView extends RelativeLayout {

    private Context mContext;

    private ImageButton mMinusImgBtn;
    private ImageButton mPlusImgBtn;
    private SeekBar mSeekBar;
    private TextView mValueTv;

    private int mMax = 100;
    private int mProgress = 30;// 默认
    private int mMin = 0;
    private int mEnableMax = 100;

    private int mOffset = 0;//显示偏移值

    private boolean isSendListener = false;//判断是否需要回调listener

    private IChangeSeekbarProgressListener mListener;

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

    public MyOperationProgressView(Context context, AttributeSet attrs){
        this(context, attrs, 0);
    }

    public MyOperationProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
        LayoutInflater.from(mContext).inflate(R.layout.operation_progress_view,this);
        initView();
        setListener();
        updateSeekBarProgress();
    }

    private void initView(){
        mMinusImgBtn = (ImageButton) findViewById(R.id.minus_imgBtn);
        mPlusImgBtn = (ImageButton) findViewById(R.id.plus_imgBtn);
        mSeekBar = (SeekBar) findViewById(R.id.seekbar);
        getValueTv();
    }

    private void setListener(){
        mMinusImgBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mProgress > 0){
                    mProgress--;
                    isSendListener = true;
                    updateSeekBarProgress();
                    isSendListener = false;
                }
            }
        });
        mPlusImgBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mProgress < mEnableMax){
                    mProgress++;
                    isSendListener = true;
                    updateSeekBarProgress();
                    isSendListener = false;
                }
            }
        });
        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                mProgress = progress;
                if(isSendListener && mListener != null) mListener.ChangeProgress(MyOperationProgressView.this, progress);
                if(mValueTv != null) mValueTv.setText(String.valueOf(mProgress + mOffset));
                updateImgBtnStatus();
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                isSendListener = true;
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                isSendListener = false;
            }
        });
    }

    public void setChangeSeekbarProgressListener(IChangeSeekbarProgressListener listener){
        mListener = listener;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec,heightMeasureSpec);
        mValueTv.measure(MeasureSpec.makeMeasureSpec(40, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(40, MeasureSpec.EXACTLY));
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        mProgress = mSeekBar.getProgress();
        final int height = b - t;
        int mValueLeftBound = getWidth() - mSeekBar.getWidth() - mPlusImgBtn.getWidth();
        float mMoveStep = (float) mSeekBar.getWidth() / (float) mEnableMax;
        int  mValueTvLeft = mValueLeftBound + (int) (mMoveStep * mProgress);
        /* 实时value显示 */
        mValueTv.layout(mValueTvLeft, 50, mValueTvLeft + mValueTv.getMeasuredWidth(), height);
    }

    public void setSeekBarMaxMin(int max, int min){
        this.mMax = max;
        this.mMin = min;
        this.mEnableMax = max - min;
        mSeekBar.setMax(mEnableMax);
    }

    public void setSeekBarProgress(int progress){
        this.mProgress = this.mProgress > mEnableMax ? mEnableMax : progress;
        updateSeekBarProgress();
    }

    private void updateSeekBarProgress(){
        mSeekBar.setProgress(mProgress);
    }

    public void setEnable(boolean enable){
        mMinusImgBtn.setEnabled(enable);
        mPlusImgBtn.setEnabled(enable);
        mSeekBar.setEnabled(enable);
    }

    /*在progress最大最小值时,改变ImageButton的状态*/
    private void updateImgBtnStatus(){
        if (mProgress == mEnableMax){
            mPlusImgBtn.setEnabled(false);
        }else if(mProgress == 0){
            mMinusImgBtn.setEnabled(false);
        }else {
            mPlusImgBtn.setEnabled(true);
            mMinusImgBtn.setEnabled(true);
        }
    }

    private TextView getValueTv(){
        if (mValueTv == null){
            mValueTv = new TextView(mContext);
            mValueTv.setTextColor(mContext.getResources().getColor(R.color.light_blue));
            mValueTv.setTextSize(22);
            addView(mValueTv);
        }
        return mValueTv;
    }

    /**
     * 设置显示偏移值
     * */
    public void setOffset(int offset) {
        this.mOffset = offset;
    }

    public interface IChangeSeekbarProgressListener {
        public void ChangeProgress(View view, int progress);
    }
}

你可能感兴趣的:(android)