Android开发之时间刻度盘

一、最近的一个项目中有遇到时间刻度盘的需求,在网上没找到合适的,于是自己就花点时间实现了,现在分享出来,效果如下图:

在介绍如何实现之前,先大概介绍一个这个时间刻度盘的功能:

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(
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值