仿淘宝-商品浏览ScrollViewContainer

2016-07-06  本文已影响1216人  jacky123

效果

设计思想

  1. 在布局中放置两个 ScrollView,并分别为其设置 OnTouchListener,时刻判断 ScrollView 的滚动距离,一旦第一个ScrollView滚动到底部,
    则标识改为可向上拖动,此时开始记录滑动距离 mMoveLen,根据 mMoveLen 重新 layout 两个 ScrollView;
    同理,监听第二个 ScrollView 是否滚动到顶部,以往下拖动。
  2. 在 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());
    }

感悟

  1. 如何判断 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

上一篇下一篇

猜你喜欢

热点阅读