在继承View控件重写控件功能时,时常会对控件内容进行滚动,那么就需要调用View内容移动的两个方法之一:
View.scrollBy(int x, int y) --> 内容平滑地滚动到目标坐标(可看的移动效果)
View.scrollTo(int x, int y) --> 内容马上滚动到目标坐标(瞬移!?)
当滚动时,还需要判断滚动的内容是否超过显示界限,此时要调用到两个方法来获取滚动的距离(这里需要注意的是,View是以左上角为坐标原点(0,0)),
方法:View.getScrollX() -->获取水平坐标移动距离
View.getScrollY() -->获取垂直坐标移动距离
如:
1.手指向右滑动,而内容向左滚动,View.getScrollX()得到的是负值
2.手指向左滑动,而内容向右滚动,View.getScrollX()得到的是正值
3.手指向下滑动,而内容向上滚动,View.getScrollY()得到的是负值
4.手指向上滑动,而内容向下滚动,View.getScrollY()得到的是正值
简而言之,就是手指滑动的方向和内容滚动的方向相反,参考ListView 和 HorizontalScrollView 的界面效果便知
在获取到值后,可以通过(new Scroller()).startScroll(int startX, int startY, int dx, int dy)方法将内容滚动到适当的位置
在View的重写方法中进行Scroller滚动响应:
@Override public void computeScroll() { if (scroller.computeScrollOffset()) { // 调用这个下面的条件是由于scroller调用了滑动从而使它激发 scrollTo(scroller.getCurrX(), scroller.getCurrY()); invalidate(); return; } super.computeScroll(); }