1. 程式人生 > >自定義帶刻度的進度條(seekbar)

自定義帶刻度的進度條(seekbar)

效果:

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:layout_alignParentRight="true">

    <ImageButton
        android:id="@+id/minus_imgBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="15dp"
        android:background="@drawable/su2_seekbar_minus_bg"/>

    <SeekBar
        android:id="@+id/seekbar"
        style="@style/seekbar_style"/>

    <ImageButton
        android:id="@+id/plus_imgBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/su2_seekbar_plus_bg"/>
</LinearLayout>

seekbar的style:

<style name="seekbar_style">
    <item name="android:layout_width">380dp</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:focusable">true</item>
    <item name="android:maxHeight">80dp</item>
    <item name="android:minHeight">80dp</item>
    <item name="android:paddingLeft">0dp</item>
    <item name="android:paddingRight">15dp</item>
    <item name="android:progressDrawable">@drawable/su2_seekbar_progress</item>
    <item name="android:thumb">@drawable/su2_seekbar_thumb</item>
    <item name="android:max">100</item>
</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);
        mMinusImgBtn.setId(View.NO_ID);
        mPlusImgBtn = (ImageButton) findViewById(R.id.plus_imgBtn);
        mPlusImgBtn.setId(View.NO_ID);
        mSeekBar = (SeekBar) findViewById(R.id.seekbar);
        mSeekBar.setId(View.NO_ID);
        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);
    }
}