一、最近的一个项目中有遇到时间刻度盘的需求,在网上没找到合适的,于是自己就花点时间实现了,现在分享出来,效果如下图:
在介绍如何实现之前,先大概介绍一个这个时间刻度盘的功能:
1、显示当前时间,并且可以左右拖动至上一天或者下一天,
2、根据传入的时间块来绘制蓝色部分
二、代码实现
public class ScalePanel extends View {
public interface OnValueChangeListener {
public void onValueChange(float value);
/**
* value不再变化,终点
*
* @param mCalendar
* 刻度盘上当前时间
*/
public void onValueChangeEnd(Calendar mCalendar);
}
public static final int MOD_TYPE_HALF = 2;
public static final int MOD_TYPE_ONE = 10;
private static final int ITEM_HALF_DIVIDER = 60;
private static final int ITEM_MAX_HEIGHT = 10;
private static final int TEXT_SIZE = 14;
private float mDensity;
/**
* 当前刻度值
*/
private int mValue = 12;
private int mLineDivider = ITEM_HALF_DIVIDER;
private float mLastX;
/**
* 记录刻度盘滑动的偏移量
*/
private float mMove;
private float mWidth, mHeight;
private int mMinVelocity;
private Scroller mScroller;
private VelocityTracker mVelocityTracker;
private OnValueChangeListener mListener;
/**
* 日期文字的宽度
*/
float textWidth = 0;
private TextPaint textPaint, dateAndTimePaint;
private Paint linePaint;
private boolean isNeedDrawableLeft, isNeedDrawableRight;
private Calendar mCalendar;
private Paint middlePaint, bgColorPaint;
/**
*
*/
private boolean isChangeFromInSide;
public boolean isEnd;
// 为了画背景色,从左向右画,记录下屏幕最左,最右处的时间点
private Calendar leftCalendar, rightCalendar;
private List<TVideoFile> data;
private int hour, minute, second;
int gap = 12, indexWidth = 4, indexTitleWidth = 24, indexTitleHight = 10,
shadow = 6;
String color = "#FA690C";
String dateStr, timeStr;
public ScalePanel(Context context, AttributeSet attrs) {
super(context, attrs);
mScroller = new Scroller(getContext());
mDensity = getContext().getResources().getDisplayMetrics().density;
mMinVelocity = ViewConfiguration.get(getContext())
.getScaledMinimumFlingVelocity();
linePaint = new Paint();
linePaint.setStrokeWidth(2);
linePaint.setColor(Color.parseColor("#464646"));
bgColorPaint = new Paint();
bgColorPaint.setStrokeWidth(2);
bgColorPaint.setColor(Color.parseColor("#00a3dd"));
textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(TEXT_SIZE * mDensity);
dateAndTimePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
dateAndTimePaint.setTextSize(18 * mDensity);
middlePaint = new Paint();
scaleUnit = mLineDivider * mDensity;
mCalendar = Calendar.getInstance();
initDateAndTime(mCalendar);
leftCalendar = Calendar.getInstance();
rightCalendar = Calendar.getInstance();
}
/**
* 根据时间来计算偏差,(minute*60+second)*scaleUnit/3600
*/
private void initOffSet() {
mMove = (minute * 60 + second) * scaleUnit / 3600;
}
private void initDateAndTime(Calendar mCalendar) {
this.mCalendar = mCalendar;
hour = mCalendar.get(Calendar.HOUR_OF_DAY);
minute = mCalendar.get(