Android开发中,当一个页面存放的控件超出屏幕时,通常需要使用ScrollView来包裹布局。这样用户可以通过手指的滑动来查看超出屏幕的部分。然而当ScrollView滑动到边界时,继续滑动只会显示一个阴影效果。iOS自带的控件却可以实现边界的阻尼回弹效果,这种阻尼回弹效果会让用户有更好的使用体验。这里给出一个Android上的实现方案
解决思路:
ScrollView使用时要求内部有且仅一个子View。当ScrollView滑动到边界时,让子View在ScrollView中随着手指按一定的规则进行平移,模拟出拉伸效果。当手指松开时,再让子View恢复拉伸前的位置,模拟出回弹效果。
完整的代码如下,详细的原理见注释即可
public class StretchScrollView extends NestedScrollView {
// 子View
private View innerView;
// 上次手势事件的y坐标
private float mLastY;
// 记录子View的正常位置
private Rect normal = new Rect();
public StretchScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
initView();
super.onFinishInflate();
}
/**
* 获取ScrollView的子布局
*/
p