为什么按住recyclerView向上滑动会出现如下情况 ??

来源:10-5 视频详情页视频滑动特效1

慕用0425495

2020-11-23

图片描述

按住用户信息向上滑动不会出现这种情况, 只有当FullScreenPlayerView在全屏与minHeight之间的状态, 并且按住recyclerView向上滑动, 会突然出现两者叠在一起的情况

写回答

2回答

慕用0425495

提问者

2020-11-24

将ViewDragHelper.Callback的如下两个方法改写成如下就解决了 !


@Override
public boolean tryCaptureView(@NonNull View child, int pointerId) {

    if (!canFullscreen) return false;

    if (runnable != null) {
        refChild.removeCallbacks(runnable);
    }

    int refChildBottom = refChild.getBottom();
    if (child == refChild) {
        return refChildBottom >= minHeight
                && refChildBottom <= childOriginalHeight;
    }
    else if (child == authorBelow){
        return refChildBottom < childOriginalHeight && refChildBottom >= minHeight;
    }
    else if ( child == scrollingView ){
        /**
         * 关于recyclerView.canScrollVertically(-1)的坑:
         * https://blog.csdn.net/xingchenxuanfeng/article/details/84790299
         */

        //将FullScreenView缩到后松手会有一个惯性的回弹一点点距离,
        // 若使用refChildBottom > minHeight && refChildBottom < childOriginalHeight 判断是否拖拽recyclerView不灵敏
        //return refChildBottom > minHeight + PixUtils.dp2px(5) && refChildBottom < childOriginalHeight;
        if ( refChildBottom > minHeight + PixUtils.dp2px(5) && refChildBottom < childOriginalHeight ){
            if (scrollingView.canScrollVertically(-1)) return false;
            return true;
        }

    }
    return false;
}




@Override
public int clampViewPositionVertical(@NonNull View child, int top, int dy) {
    if (refChild == null || dy == 0)
        return 0;
    //dy>0 代表手指从屏幕上放往屏幕下方滑动
    //dy<0 代表手指从屏幕下方 往屏幕上方滑动

    if (child == refChild) {
        if ((dy < 0 && refChild.getBottom() <= minHeight ) ||
                (dy > 0 && refChild.getBottom() >= childOriginalHeight) )
            return ((CoordinatorLayout.LayoutParams)refChild.getLayoutParams()).topMargin;  }  // refChild.top 一直保持在0, 其他情况能继续往下走是因为我要重新计算FullScreen布局.

    CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) child.getLayoutParams();
    int topMargin = layoutParams.topMargin;

    if(child == authorBelow) {
        if ((dy < 0 &&  refChild.getBottom() <= minHeight) ||
                (dy > 0 && refChild.getBottom() >= childOriginalHeight)) {
            return refChild.getBottom() + topMargin;
        }
    }

    if (child == scrollingView){
        if ((dy < 0 &&  refChild.getBottom() <= minHeight) ||
                (dy > 0 && refChild.getBottom() >= childOriginalHeight)) {
            return authorBelow.getBottom() + topMargin;
        }
    }


    int maxTop = 0; int consumed = 0;

    if (child == refChild) {
        if(dy > 0) {
            if (refChild.getBottom() + dy > childOriginalHeight)
                consumed = childOriginalHeight - refChild.getBottom();
            else
                consumed = dy;

        } else {
            if (refChild.getBottom() + dy < minHeight)
                consumed = minHeight - refChild.getBottom();
            else
                consumed = dy;
        }
        maxTop =  topMargin;
    }
    else if(child == authorBelow) {
        if (dy > 0) {
            //如果本次滑动的dy值 追加上 refchild的bottom 值会超过 父容器的最大高度值
            //此时 咱们应该 计算一下
            if (refChild.getBottom() + dy > childOriginalHeight) {
                maxTop = childOriginalHeight + topMargin;
                consumed = childOriginalHeight - refChild.getBottom();
            } else {
                maxTop = refChild.getBottom() + dy + topMargin;
                consumed = dy;
            }

        } else {
            //else 分支里面 dy的值 是负值。
            //如果本次滑动的值  dy 加上refChild的bottom 会小于minHeight。 那么咱们应该计算一下本次能够滑动的最大距离
            if (refChild.getBottom() + dy < minHeight) {
                maxTop =  minHeight + topMargin;
                consumed = minHeight - refChild.getBottom();
            } else {
                maxTop = refChild.getBottom() + dy + topMargin;
                consumed = dy;
            }
        }
    }
    else if (child == scrollingView) {
        /**
         * 为去除拖动recyclerView到顶部出现"抖动", 我将recyclerView子View的marginTop=10dp属性移到了recyclerView.Header中,
         * 但是不明白为什么这样就消除"抖动了", 以后recyclerView的layout_marginTop属性慎用甚至不用
         */
        if (dy > 0 && !(scrollingView.canScrollVertically(-1))) {

            //如果本次滑动的dy值 追加上 refchild的bottom 值会超过 父容器的最大高度值
            //此时 咱们应该 计算一下
            if (refChild.getBottom() + dy > childOriginalHeight) {
                maxTop =  childOriginalHeight - refChild.getBottom() + authorBelow.getBottom() + topMargin;
                consumed = childOriginalHeight - refChild.getBottom();
            } else {
                maxTop = authorBelow.getBottom() + dy + topMargin;
                consumed = dy;
            }

        } else if (dy < 0 && !(scrollingView.canScrollVertically(-1))) {

            //else 分支里面 dy的值 是负值。
            //如果本次滑动的值  dy 加上refChild的bottom 会小于minHeight。 那么咱们应该计算一下本次能够滑动的最大距离
            if (refChild.getBottom() + dy < minHeight) {
                maxTop =  minHeight - refChild.getBottom() + authorBelow.getBottom() + topMargin;
                consumed = minHeight - refChild.getBottom();
            } else {
                maxTop =  authorBelow.getBottom() + dy + topMargin;
                consumed = dy;
            }
        } else if ( scrollingView.canScrollVertically(-1) ){
            //让recyclerView自己滑动, todo 但是这种情况不应该出现
            consumed = 0;
            maxTop = authorBelow.getBottom() + topMargin;
        }

    }


    //让FullScreenPlayerView中的子View以及它自己保持等比缩放
    ViewGroup.LayoutParams params = refChild.getLayoutParams();
    params.height = params.height + consumed;
    refChild.setLayoutParams(params);

    //todo 拖拽的时候也将FullScreen..底部y坐标回调出去
    if (mViewZoomCallback != null) {
        mViewZoomCallback.onDragZoom(layoutParams.height);
    }

    return maxTop;
}


1
1
qq_lee_3
兄弟,你这个authorBelow是哪个view
2022-04-11
共1条回复

慕用0425495

提问者

2020-11-23

 说"突然出现这种情况不准确", 准确说法是:

当FullScreenPlayerView在全屏与minHeight之间的状态, 并且按住recyclerView向上滑动, FullScreenPlayerView缩小过程正常, 但是一旦到达minHeight这时如果还在拉动recyclerView上滑, recyclerView会在一瞬间和FullScreenPlayerView叠在一起

0
1
qq_lee_3
麻烦问下,代码中贴的 authorBelow 是哪个啊
2022-04-11
共1条回复

开发商业级热门短视频App 掌握Jetpack组件库

Jetpack架构大揭秘,全组件实战主流且功能完整的短视频App

1364 学习 · 607 问题

查看课程