弹性效果包括过度拉伸效果和反弹效果。
实现思路请看这篇文章,我基于他的实现进行了一些优化。
一、实现思路
这个问题的本质是控制ScrollView装载的View(不妨叫它innerView)的显示位置。而innerView显示位置的改变可以通过两种方式实现。
- 改变ScrollView的mScrollY
- 调用innerView的layout(l, t, r, b)函数
前者就是ScrollView实现正常滚动的方式。而后者就是我们拿来实现反弹效果的。也就是说,在ScrollView正常滚动达到极限的时候,我们调用innerView的layout(l, t, r, b)函数继续"滚动"innerView。手指抬起时,意味着一次滑动的结束,这个时候,我们要判断是否要"反弹"。所以这里面有两个关键问题。
- 如何判断ScrollView的滚动已经达到极限
- 如何判断是否需要反弹
public boolean needOverScroll(float deltaY) {
final int offset = innerView.getMeasuredHeight() - getHeight();
final float scrollY = getScrollY();
return (scrollY == 0 && deltaY > 0)|| (scrollY == offset && deltaY < 0);
}
ScrollView的滚动已经达到极限分两种情况。
第一种情况是手指往下滑动无法移动innerView了。我们知道,手指往下滑动,ScrollView的mScrollY减小&#