美文网首页Android开发APP
android标尺控件的实现

android标尺控件的实现

作者: waiwaaa | 来源:发表于2018-08-20 15:36 被阅读192次

需求

本示例来源于选取酒量的需求,要求最小取酒量为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查看

相关文章

网友评论

    本文标题:android标尺控件的实现

    本文链接:https://www.haomeiwen.com/subject/vuntiftx.html