公司有个需求需要自定义的滑动设置升高体重的界面。首先感谢github上的这个开源让我学习。https://github.com/LichFaker/ScaleView。因为需求有点不一样。需要自定义颜色。所以在它的基础上改了画线的位置和刻度的颜色。看一下界面。
上代码。首先需要有个基础的基类BaseScaleView。
public abstract class BaseScaleView extends View {
public static final int[] ATTR = {
R.attr.scale_view_min,
R.attr.scale_view_max,
R.attr.scale_view_margin,
R.attr.scale_view_height,
};
public static final int SCALE_MIN = 0;
public static final int SCALE_MAX = 1;
public static final int SCALE_MARGIN = 2;
public static final int SCALE_HEIGHT = 3;
private static final String TAG = null;
protected int mMax; //最大刻度
protected int mMin; // 最小刻度
protected int mCountScale; //滑动的总刻度
protected int mScaleScrollViewRange;
protected int mScaleMargin; //刻度间距
protected int mScaleHeight; //刻度线的高度
public int getmScaleMargin() {
return mScaleMargin;
}
public void setmScaleMargin(int mScaleMargin) {
this.mScaleMargin = mScaleMargin;
}
public int getmScaleHeight() {
return mScaleHeight;
}
public void setmScaleHeight(int mScaleHeight) {
this.mScaleHeight = mScaleHeight;
}
protected int mScaleMaxHeight; //整刻度线高度
protected int mRectWidth; //总宽度
protected int mRectHeight; //高度
protected Scroller mScroller;
protected int mScrollLastX;
protected int mTempScale; // 用于判断滑动方向
protected int mMidCountScale; //中间刻度
private int width;
protected OnScrollListener mScrollListener;
public interface OnScrollListener {
void onScaleScroll(int scale);
}
public BaseScaleView(Context context) {
super(context);
init(null);
}
public BaseScaleView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public BaseScaleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}
// @TargetApi(Build.VERSION_CODES.LOLLIPOP)
// public BaseScaleView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
// super(context, attrs, defStyleAttr, defStyleRes);
// init(attrs);
// }
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
protected void init(AttributeSet attrs) {
// 获取自定义属性
TypedArray ta = getContext().obtainStyledAttributes(attrs, ATTR);
mMin = ta.getInteger(SCALE_MIN, 0);
mMax = ta.getInteger(SCALE_MAX, 240);
mScaleMargin = ta.getDimensionPixelOffset(SCALE_MARGIN, 15);
mScaleHeight = ta.getDimensionPixelOffset(SCALE_HEIGHT, 20);
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
width = wm.getDefaultDisplay().getWidth();
ta.recycle();
mScroller = new Scroller(getContext());
initVar();
}
@Override
protected void onDraw(Canvas canvas) {
// 画笔
Paint paint = new Paint();
paint.setColor(Color.GRAY);
// 抗锯齿
paint.setAntiAlias(true);
// 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
paint.setDither(true);
// 空心
paint.setStyle(Paint.Style.STROKE);
// 文字居中
paint.setTextAlign(Paint.Align.CENTER);
onDrawLine(canvas, paint);
onDrawScale(canvas, paint); //画刻度
onDrawPointer(canvas, paint); //画指针
super.onDraw(canvas);
}
protected abstract void initVar();
// 画线
protected abstract void onDrawLine(Canvas canvas, Paint paint);
// 画刻度
protected abstract void onDrawScale(Canvas canvas, Paint paint);
// 画指针
protected abstract void onDrawPointer(Canvas canvas, Paint paint);
/**
* 使用Scroller时需重写
*/
@Override
public void computeScroll() {
super.computeSc