为什么按住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; }
112022-04-11 -
慕用0425495
提问者
2020-11-23
说"突然出现这种情况不准确", 准确说法是:
当FullScreenPlayerView在全屏与minHeight之间的状态, 并且按住recyclerView向上滑动, FullScreenPlayerView缩小过程正常, 但是一旦到达minHeight这时如果还在拉动recyclerView上滑, recyclerView会在一瞬间和FullScreenPlayerView叠在一起
012022-04-11
相似问题