一直想搞一个滚动的尺子功能,精力有限,又赖没去实现过! 后来项目中有个类似的功能,前期做一些核心功能所以那个功能一直在使用替代方案,后期觉得实在看不下去了!想想还是需要解决一下这个功能!在网上找了一下类似功能,发现都不能满意!花了点时间研究了开源项目kankan.wheel.widget.WheelView @author Yuri Kanivets, 感觉原理差不多,不过WheelView 是垂直的选择器, 我需要的是可以水平滚动的尺子,而且我也不需要适配数据! 砍掉了大部分!重新改造适合自己的需求功能
上效果图
第一张 第二张
第三张
贴上RulerWheel.java 部分源码(注. WheelScroller .java 和 WheelView.java 重新命名为 RulerWheel.java 和 WheelHorizontalScroller.java )
一、首先是onTouchEvent事件、
public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastTouchedX = event.getX(); scroller.forceFinished(true); clearMessages(); break; case MotionEvent.ACTION_MOVE: // perform scrolling int distanceX = (int) (event.getX() - lastTouchedX); if (distanceX != 0) { startScrolling(); listener.onScroll(distanceX); lastTouchedX = event.getX(); } break; } if (!gestureDetector.onTouchEvent(event) && event.getAction() == MotionEvent.ACTION_UP) { justify(); } return true; }
ACTION_MOVE处理了每次滑动的偏移量,看下面doScroll
private void doScroll(int delta) { scrollingOffset += delta; int offsetCount = scrollingOffset / mLineDivder; if (0 != offsetCount) { // 显示在范围内 int oldValue = Math.min(Math.max(0, mCurrValue), mMaxValue); mCurrValue -= offsetCount; scrollingOffset