效果:
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);
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);
}
}