最近在做一个时间设置功能,之前都是简单的用一个EditText来实现,并设置输入范围或者输入错误的警告信息,这样的方法虽然简单,但用户使用起来,显得繁琐,而且还动不动的蹦出来俩提示,一点都不友好。
因此这次换个新的设计吧——卡尺选择。
主要介绍一下这个View的主要几个绘制点:
1. 坐标轴:需要绘制X轴(横向卡尺)或Y轴(纵向卡尺)drawLine(Canvas canvas, Paint paint);
2. 刻度:需要绘制坐标轴上的刻度。drawScale(Canvas canvas, Paint paint);
绘制刻度时,需要的参数有坐标轴宽度以及刻度之间的间隔;
3. 当前刻度指针:drawScalePointer(Canvas canvas, Paint paint);
需要绘制在当前卡尺显示区域的中点。由于卡尺的这个指针每次卡尺滚动都需要重新绘制,所以每次都需要计算当前显示区域的中点位置,而这个中间位置是相对于卡尺起点位置的坐标;
4. 滑动卡尺支持scroll以及fling方式,且注意滑动的边界处理。
其他的就不多说了,直接上代码吧,代码中都有注释:
首先是卡尺绘制的基类,
package rkhy.com.ecg.view.scale;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.VelocityTracker;
import android.view.View;
import android.widget.Scroller;
import rkhy.com.ecg.R;
/**
* **************************************************
*
* @ 日 期:2018/1/5 15:33
* @ 作 者:shangming
* 卡尺基类
* **************************************************
*/
public abstract class BaseScaleView extends View {
protected int mScaleMin; // 刻度最小值
protected int mScaleMax; // 刻度最大值
protected int mScaleHeight; // 刻度高度
protected int mScaleNumHeight; // 整数刻度高度
protected int mScaleSpace; // 刻度间隔
protected int mScaleCount; //相对刻度起点滑动的刻度
protected int mViewWidth; //宽度
protected int mViewHeight; //高度
protected int mScrollPreX;
protected int mInitMiddleScalePointer; // 初始中间刻度指针
protected int mScrollViewWidth; // 滚动的View宽度
protected int mScaleMiddle; // 屏幕中间的刻度偏移量
protected Scroller mScroller;
protected OnScaleScrollListener mOnScaleScrollListener;
protected VelocityTracker mVelocityTracker;
public BaseScaleView(Context context) {
super(context);
init(context, null);
}
public BaseScaleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public BaseScaleView(Context context, @Nullable Attri