效果
设计思想
- 在布局中放置两个 ScrollView,并分别为其设置 OnTouchListener,时刻判断 ScrollView 的滚动距离,一旦第一个ScrollView滚动到底部,
则标识改为可向上拖动,此时开始记录滑动距离 mMoveLen,根据 mMoveLen 重新 layout 两个 ScrollView;
同理,监听第二个 ScrollView 是否滚动到顶部,以往下拖动。
- 在 ScrollViewContainer 的 dispatchTouchEvent 中对控制 mMoveLen(布局移动的变化),在 ACTION_MOVE,ACTION_UP 重新Layout布局。
两个ScrollView的layout参数统一由 mMoveLen 决定。
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
topView.layout(0, (int) mMoveLen, mViewWidth,topView.getMeasuredHeight() + (int) mMoveLen);
bottomView.layout(0, topView.getMeasuredHeight() + (int) mMoveLen, mViewWidth, topView.getMeasuredHeight() + (int) mMoveLen
+ bottomView.getMeasuredHeight());
}
感悟
- 如何判断 ScrollView 滑到最低下和最上面?
private OnTouchListener topViewTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ViewGroup sv = (ViewGroup) v;
//判断ScrollView滑到最低下了,sv.getScrollY()是一个大于0的 int 值整数,我们可以理解为盖板向下移动了。显示的下面的内容;
//或者内容向上移动了,其实就是一个相对移动的过程。
if (sv.getScrollY() == (sv.getChildAt(0).getMeasuredHeight() - sv.getMeasuredHeight()) && mCurrentViewIndex == 0)
canPullUp = true;
else
canPullUp = false;
return false;
}
};
源码地址
ScrollViewContainer