实现区间阈值,自定义区间大小,步进大小,单位设置。
一、自定义属性
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="SeekBarPressure"> <attr name="seek_min" format="integer" /> <attr name="seek_max" format="integer" /> <attr name="seek_step" format="integer" /> <attr name="seek_unit" format="string" /> <attr name="seek_low_offset" format="dimension" /> <attr name="seek_high_offset" format="dimension" /> </declare-styleable> </resources>
二、自定义SeekBarPressure类
public class SeekBarPressure extends View { private static final String TAG = "SeekBarPressure"; private static final int CLICK_ON_LOW = 1; //点击在前滑块上 private static final int CLICK_ON_HIGH = 2; //点击在后滑块上 private static final int CLICK_IN_LOW_AREA = 3; private static final int CLICK_IN_HIGH_AREA = 4; private static final int CLICK_OUT_AREA = 5; private static final int CLICK_INVAILD = 0; /* * private static final int[] PRESSED_STATE_SET = { * android.R.attr.state_focused, android.R.attr.state_pressed, * android.R.attr.state_selected, android.R.attr.state_window_focused, }; */ private static final int[] STATE_NORMAL = {}; private static final int[] STATE_PRESSED = {android.R.attr.state_pressed, android.R.attr.state_window_focused,}; private Drawable hasScrollBarBg; //滑动条滑动后背景图 private Drawable notScrollBarBg; //滑动条未滑动背景图 private Drawable mThumbLow; //前滑块 private Drawable mThumbHigh; //后滑块 private int mScollBarWidth; //控件宽度=滑动条宽度+滑动块宽度 private int mScollBarHeight; //滑动条高度 private int mThumbWidth; //滑动块宽度 private int mThumbHeight; //滑动块高度 private int mOffsetLow = 0; //前滑块中心坐标 private int mOffsetHigh = 0; //后滑块中心坐标 private int mLastOffsetLow = -1; //前滑块中心坐标之前位置 private int mLastOffsetHigh = -1; //后滑块中心坐标之前位置 private double mDistance = 0; //总刻度是固定距离 两边各去掉半个滑块距离 private int mThumbMarginTop = 25; //滑动块顶部距离上边框距离,也就是距离字体顶部的距离 private int mFlag = CLICK_INVAILD; private OnSeekBarChangeListener mBarChangeListener; private double mSeekLow = 0; //前滑块数值位置 private double mSeekHigh = 10; //后滑块数值位置 private String mUnit = "mm"; //单位 private int mSeekMin; private int mSeekMax; private double mSeekStep; private double mSeekTotal;//总步数 public SeekBarPressure(Context context) { this(context, null); } public SeekBarPressure(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SeekBarPressure(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SeekBarPressure); mSeekMin = typedArray.getInteger(R.styleable.SeekBarPressure_seek_min, 0); mSeekMax = typedArray.getInteger(R.styleable.SeekBarPressure_seek_max, 0); mSeekStep = typedArray.getInteger(R.styleable.SeekBarPressure_seek_step, 1); mSeekTotal = (mSeekMax - mSeekMin) / mSeekStep; mUnit = typedArray.getString(R.styleable.SeekBarPressure_seek_unit); typedArray.recycle(); Resources resources = getResources(); notScrollBarBg = resources.getDrawable(R.drawable.seekbarpressure_bg_normal); hasScrollBarBg = resources.getDrawable(R.drawable.seekbarpressure_bg_progress); mThumbLow = resources.getDrawable(R.drawable.seekbarpressure_thumb); mThumbHigh = resources.getDrawable(R.drawable.seekbarpressure_thumb); mThumbLow.set