android 原生的seekbar只能单向选择滑动,当项目需要选取范围的时候,这明显是不能够满足要求的。所以就得自己实现一个双向滑动的Seekbar了,就取名为DoubleSeekBar吧。
而自定义View由是Android知识点中必须掌握的技能所以,这里就写一下自己的实现吧。着急的同学,可以直接拷贝代码直接使用。
由于布局比较简单,这里直接继承View,然后重写onLayout(),onMeasure(),onDraw()方法,代码里注释比较齐全,想多了解的,可以看着注释理解下。
代码如下:
public class DoubleSeekBar extends View {
private static final String TAG = "DoubleSeekBar";
private static final int CLICK_TYPE_NULL = 0;
private static final int CLICK_TYPE_LEFT = 1;
private static final int CLICK_TYPE_RIGHT = 2;
private Bitmap leftIcon;
private Bitmap rightIcon;
private Bitmap clickIcon;
private int maxValue;//最大值
private int minValue;//最小值
private int leftValue, rightValue;
private int defaultWidth = 0;
private int defaultHeight = 0;
private float bgHeight;
private float paddingLeft, paddingRight;
private float indexLeftX, indexLeftY;//左按钮的坐标值
private float indexRightX, indexRightY;//右按钮的坐标值
private int viewWidth, viewHeight;
private float startLeftX, startRightX;//左右按钮的开始x轴坐标值
private int clickedType = CLICK_TYPE_NULL;//0 没有点击,1点击中左按钮,2点击中右按钮
private Paint paintBg = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint paintBg2 = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint iconPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private OnChanged mOnChanged;
public DoubleSeekBar(Context context) {
this(context, null);
}
public DoubleSeekBar(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public DoubleSeekBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
bgHeight = UIUtil.dp2px(context, 2);//设置背景线条的高度
leftIcon = getBitmap(R.drawable.double_seek_bar_icon);
rightIcon = getBitmap(R.drawable.double_seek_bar_icon);
clickIcon = getBitmap(R.drawable.double_seek_bar_click_icon);
paddingLeft = UIUtil.dp2px(context, 16);
paddingRight = UIUtil.dp2px(context, 16);
paintBg.setColor(getResources().getColor(R.color.md_red_A400));
paintBg2.setColor(getResources().getColor(R.color.md_grey_400));
maxValue = 100;//default maxvalue
minValue = 0;//default minvalue
leftValue = minValue;
rightValue = maxValue;
defaultWidth = UIUtil.dp2px(context, 100);
defaultHeight = UIUtil.dp2px(context, 50);
setLayerType(LAYER_TYPE_SOFTWARE, null);
}
private Bitmap getBitmap(int drawableRes) {
Drawable drawable = getResources().getDrawable(drawableRes);