需求
本示例来源于选取酒量的需求,要求最小取酒量为50,最大为300(有些为500),选取的数量为50的倍数,如果剩余量不足最大值,则可以不为50的倍数。
成品效果
设置取值空间为50~283,显示刻度为0 ~ 500
wineview.gif
实现要点
- 通过重写onDraw用canvas画出刻度及数字
- 重写onTouchEvent来实现滑动
- 通过Scroller来达到平滑效果
draw
- onDraw的过程通过当前值,通过取整数倍取到靠左边的长刻度的值,然后计算出画横线的左右两点
int mFixValue=mValue/maxUnit*maxUnit;
- 遍历刻度范围,在显示区域则画刻度,为长刻度时同时要画出文字
- 通过
Layout.getDesiredWidth("0", textPaint);
来得到一个字符的宽度,从而得到画出文字的宽度来让文字与长刻度居中对齐
onTouchEvent
MotionEvent.ACTION_UP,MotionEvent.ACTION_CANCEL都表应该结束滑动,不了解事件的可以参考 事件分发笔记
Scoller常用的api:
mScroller.getCurrX() //获取mScroller当前水平滚动的位置
mScroller.getCurrY() //获取mScroller当前竖直滚动的位置
mScroller.getFinalX() //获取mScroller最终停止的水平位置
mScroller.getFinalY() //获取mScroller最终停止的竖直位置
mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置
mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置
//滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间
mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250ms
mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)
//返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。
mScroller.computeScrollOffset()
//startY 开始位置, velocityY 滑动的速度, 像素, maxX 最小的值 , maxY 最大的值,最后的结果不会超过这个值
mScroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY);
实现代码只有一个类,具体代码示例请到github查看
网友评论