最近項目使用CoordinatorLayout + Webview實現(xiàn)文章詳情頁上拉折疊頭部效果,由于Webview并不支持app:layout_behavior饭冬,于是在Webview外套了一層NestScrollView, 由NestScrollView支持app:layout_behavior,然后重寫NestScrollView的dispatchNestedScroll來控制Wevview的滾動带到,一開始的實現(xiàn)是
```
val canScroll =mWebView.canScrollVertically(dy)
if (canScroll) {
? ? ...
????mWebView.scrollBy(dxUnconsumed, dy)
? ? ...
????return true
}
```
然后發(fā)現(xiàn)往上滾時缠捌,mWebView頂部的一些內容滾不下來了,而且canScrollVertically返回false
后來通過一番研究轨功,發(fā)現(xiàn)這是View的一個坑(也算是View的一個bug)
View內部有個變量mScrollY記錄當前滾動距離,當scrollBy(dxUnconsumed, dy)中的dy+mScrollY < 0 時容达,scrollBy不會進行任何實際滾動古涧,但同時它卻會把mScrollY設為為dy+mScrollY
這就導致之后怎么滾都滾不下來(此時dy < 0)
因為canScrollVertically()的實現(xiàn)是:
```
public boolean canScrollVertically(int direction) {
final int offset = computeVerticalScrollOffset();
? ? final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
? ? if (range ==0)return false;
? ? if (direction <0) {
return offset >0;
? ? }else {
return offset < range -1;
? ? }
}
protected int computeVerticalScrollOffset() {
return mScrollY;
}
```
當最后一次滾動的dy < -mScrollY 時,?mScrollY = dy+mScrollY, mScrollY變?yōu)樨摂?shù)花盐,導致之后的往上滾時canScrollVertically都是返回false羡滑。
問題解決的方法是實現(xiàn)dispatchNestedScroll改為以下代碼
```
val canScroll =mWebView.canScrollVertically(dy)
if (canScroll) {
? ? ...
????if (dy < 0) {
????????dy = -min(-dy, mWebView.computeVerticalScrollOffset())
????????mWebView.view.scrollBy(dxUnconsumed, dy)
????????return true
????}
? ? ...
????return true
}
```