自定義帶刻度的進度條(seekbar)
阿新 • • 發佈:2018-12-09
效果:
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); } }