遇到一个问题 ,请大佬们帮看看,能解决或者提供解决思路的兄弟得来杯 Manner。

查看 82|回复 7
作者:waitMeOY   
先祝大家假期快乐,但是我被一个问题困扰不已。
问题:类似传承电商首页实现 tab 吸顶的效果,nestscrollview+viewpager+recyclerview
我在外层的 Nestscrollview 自定义的时候当滚动一定距离后我把 fling 传递给内层的 reyclerview 去 fling,然后会有一瞬间的加速感,不同设备体现还不一样,滚动的代码大概就这么多。
请问大家有什么思路。
之前有朋友提出“NestedScrollingParent3Layout 这个是自定义的吧  换普通 recyclerview 然后 item 放 recyclerview 。有能复用的 item 尽量用 recyclerview 看着像资源太多卡顿了”
但是我觉得我自定义的实际是继承了 nestscrollview ,继承系统的 然后重写了一些嵌套滚动的方法,这么设计是没毛病的。

nestedscrollview, recyclerview, fling

waitMeOY
OP
  
代码传不上去,贴就提示 不受欢迎 ,访问被拒绝。现在有什么贴图的办法吗
prettybot   
放 gist 片段链接呗
waitMeOY
OP
  
private void initView(Context context) {
        mFlingHelper = new FlingHelper2(context);
        mScroller = new OverScroller(context);
        mMaximumFlingVelocity = ViewConfiguration.get(context).getScaledMaximumFlingVelocity();
        velocityDecayCalculator = new VelocityDecayCalculator(context);
        Log.d(TAG, "速度限定为: " + mMaximumFlingVelocity);
        setOnScrollChangeListener(new OnScrollChangeListener() {
            @Override
            public void onScrollChange(@NonNull NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                Log.d("onScrollChange", "---------isFlinging-------" + velocityY + "");
                if (isStartFling) {
                    totalDy = 0;
                    isStartFling = false;
                }
                if (scrollY == getTopViewHeight() && !mChildrenScrollWrapperView.isScrollToBottom()) {
                    //开始底部的滑动
//                    dispatchChildFlingImproved();
                    float v1 = NestedNSVOverScroller.invokeCurrentVelocity(NestedScrollingParent3Layout.this);
                    dispatchChildFling(v1);
                }
                totalDy += scrollY - oldScrollY;
            }
        });
    }
waitMeOY
OP
  
private void dispatchChildFling(float v1) {
        startChildScrollWithScroller( v1);
//        if (velocityY != 0) {
//            double totalDistance = mFlingHelper.getSplineFlingDistance(velocityY);
//            //根据速度求的距离大于滑动的距离时
//            if (totalDistance > totalDy) {
//                //求距离差的速度
//                if (totalDistance > 0 && mChildrenScrollWrapperView != null) {
//                    // 开始子视图滚动
//
//                } else {
//                    Log.d(TAG, "子视图无法滚动或剩余距离不足");
//                }
//            }
//        }
    }
    /**
     * 使用 Scroller 开始子视图滚动
     */
    private void startChildScrollWithScroller( float velocity) {
        if (mChildrenScrollWrapperView == null || mChildrenScrollWrapperView.isScrollToBottom()) {
            Log.d(TAG, "子视图无法滚动");
            return;
        }
        // 停止父视图的滚动
        fling(0);
        Log.d(TAG, "startChildScrollWithScroller=====" + velocity);
        // 重置滚动状态
        mLastScrollY = 0;
        mChildrenScrollWrapperView.flingY((int) velocity);
    }
waitMeOY
OP
  
@prettybot 放了
cz5424   
Android 官方推荐的嵌套滑动链路:
外层做 AppBarLayout + CoordinatorLayout ,或者 ViewPager2 里每个 tab 用 RecyclerView ,本身就支持嵌套 fling ,不需要自己拦截再转发。
如果能换掉自定义的 NestedScrollingParent3Layout ,很多坑就不必自己处理。
cz5424   
你这个“瞬间加速感”其实是 fling 惯性传递两边叠加了,NestedScrollView 停止时剩余的速度没有被完全吸收,又被你手动算出来传给子 RecyclerView 去 fling ,一旦计算或时机没控制好,就会造成那一下猛冲的体验。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部