自定义view---滚动的刻度尺(一)

自定义view:有如下三种方式实现:1.组合自定义view。2.继承重写的自定义view 3.绘制的自定义view

公司要制作一个滚动的刻度尺:

我第一个想到的事情是怎么弄刻度了

很快我决定用第三个方案:

1.绘制自定义view

1>在onDraw()里面绘制刻度尺

2>在computeScroll()中编写滑动过载后还可以滑动的距离

3>在onTouch()中ActionUp 判断可以过载的距离

public class HScrollView extends View {

	private Paint mLinePaint;
	private Paint mShortLinePaint;

	/** The scroller. */
	private Scroller scroller;

	private HScrollViewLister mHScrollViewLister;

	private float currutX;
	private float currutY;

	/** The last scroll y. */
	private float lastX;
	private float lastY;

	/**
	 * @Fields scale_Mumx Description刻度数量
	 */
	private int scale_Nums;

	/**
	 * @Fields scale_Num_Width Description:带数据刻度矩形的宽度
	 */
	private final float scale_Num_Rect_Width = 3;
	/**
	 * @Fields scale_Max Description:刻度范围最大值
	 */
	private int value_Scale_Max = 10;
	/**
	 * @Fields scale_Min Description:刻度范围最小值
	 */
	private int value_Scale_Min = 0;
	/**
	 * @Fields value_Scale_Little Description:小刻度取值范围
	 */
	private int value_Scale_Little = 2;

	/**
	 * @Fields scale_Num_Space_Little Description:小刻度的间隔值
	 */
	private int scale_Num_Space_Little = 5;// 1\2\5
	/**
	 * @Fields scale_Num_Space Description:数据刻度的间隔
	 */
	private int scale_Num_Space_Big = 10;

	/**
	 * @Fields Start_Offset_X Description:绘制刻度的起始点X位置
	 */
	private final int Start_Offset_X = 0;// 开始点的起初X位置

	/**
	 * @Fields total_Width Description:view的总长
	 */
	private float total_Width = 0;

	/**
	 * @Fields screen_Width Description:当前屏幕宽度
	 */
	private int screen_Width;
	
	public HScrollView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		init(context);
	}

	public HScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		init(context);
	}

	public HScrollView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		init(context);
	}

	public float getLastX() {
		return lastX;
	}

	public float getLastY() {
		return lastY;
	}

	public void setmHScrollViewLister(HScrollViewLister mHScrollViewLister) {
		this.mHScrollViewLister = mHScrollViewLister;
	}

	private void init(Context context) {

		// TODO Auto-generated method stub
		scroller = new Scroller(context);

		DisplayMetrics displayMetrics = new DisplayMetrics();
		((Activity) context).getWindowManager().getDefaultDisplay()
				.getMetrics(displayMetrics);
		screen_Width = displayMetrics.widthPixels;
	
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		mLinePaint = new Paint();
		mLinePaint.setColor(Color.WHITE);
		int width = getWidth();
		int position = 0;
		int localvalue = 0;

		setBackgroundColor(Color.BLACK);

		for (int i = value_Scale_Min * 10; i <= value_Scale_Max * 10; i++) {

			localvalue = i - value_Scale_Min;

			if (i % 10 == 0) {

				Rect r = new Rect();
				r.set(15 * localvalue + Start_Offset_X, 5, 15 * localvalue + 3
						+ Start_Offset_X, 45);
				canvas.drawRect(r, mLinePaint);
				mLinePaint.setTextSize(18.0f);
				if (i < 10) {
					position = 15 * localvalue - 5;
				} else if (i < 100) {
					position = 15 * localvalue - 7;
				} else {
					position = 15 * localvalue - 10;
				}
				canvas.drawText(String.valueOf(i / 10), position, 60,
						mLinePaint);

				scale_Nums++;
			} else if (i % scale_Num_Space_Little == 0) {
				canvas.drawLine(15 * localvalue + Start_Offset_X, 10, 15
						* localvalue + Start_Offset_X, 25, mLinePaint);

				scale_Nums++;
			}
		}

		total_Width = (value_Scale_Max - value_Scale_Min) * 15 * 10;
		if (total_Width > screen_Width) {
			total_Width += Start_Offset_X;
		}
		
		Log.i("total_Width", "total_width:" + total_Width + ",lastX:" + lastX);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int widthMode = MeasureSpec.getMode(widthMeasureSpec);
		int heightMode = MeasureSpec.getMode(heightMeasureSpec);
		int widthSize = MeasureSpec.getSize(widthMeasureSpec);
		int heightSize = MeasureSpec.getSize(heightMeasureSpec);

		int width = widthSize;// calculateLayoutWidth(widthSize, widthMode);
		int height = heightSize;
		setMeasuredDimension(width, height);

	}

	@TargetApi(Build.VERSION_CODES.HONEYCOMB)
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			lastX = event.getX();
			lastY = event.getY();

			return true;
		case MotionEvent.ACTION_MOVE:
			float newX = event.getX();
			float newY = event.getY();

			scrollBy((int) ((lastX - newX) * 2), 0);
			lastX = newX;
			lastY = newY;

			if (mHScrollViewLister != null) {
				mHScrollViewLister.onScroller(getLastX(), getScrollY());
			}

			Log.i("Move", ",右 :" + getScrollX() + ",左:" + lastY);
			break;
		case MotionEvent.ACTION_UP:

			int scrollX = getScrollX();
			int scrollY = getScrollY();

			Log.i("up",
					"scrollX: " + scrollX + ",右 :" + (lastX + screen_Width / 2)
							+ ",左:" + Math.round(-screen_Width / 2));
			// x轴向左可以过载的距离
			if (scrollX < Math.round(-screen_Width / 2)) {
				scroller.setFinalX(Math.round(-screen_Width / 2));
				// scroller.startScroll(scrollX, 0, -scrollX, 0);
				invalidate();

			} else if (scrollX > total_Width - screen_Width * 5 / 6) {
				// x轴向右滚动可以过载的距离
				// scroller.startScroll(scrollX, 0, -scrollX / 2, 0);
				scroller.setFinalX((int) (total_Width - screen_Width / 2));
				invalidate();
			} 
			else{
//				Float x = new Float(scroller.getCurrX());
//				float xx = 0.0f;
//				for(Float l : xPosList){
//					if(l.isInfinite(x)){
//						xx = l;
//						break;
//					}
//				}
//				scroller.setFinalX((int) xx);
			}
			break;
		default:
			break;
		}
		return super.onTouchEvent(event);
	}

	@Override
	public void computeScroll() {
		if (scroller.computeScrollOffset()) {
			// 调用这个下面的条件是由于scroller调用了滑动从而使它激发
			scrollTo(scroller.getCurrX() + 25, scroller.getCurrY());
			invalidate();
			return;
		}
		super.computeScroll();
	}

	public interface HScrollViewLister {
		void onScroller(float x, float y);
	}
}


实现效果如下:


待解决问题:

1.由于是绘制的view ,view长度与宽度是无限的。计算移动的距离与坐标的关系,像素与间距的计算。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值