Skip to content

Commit 07a51cd

Browse files
committed
feat(webview): implement nested scroll on Android
1 parent ddc23b0 commit 07a51cd

File tree

2 files changed

+109
-3
lines changed

2 files changed

+109
-3
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11

22
dependencies {
3-
4-
}
3+
implementation 'androidx.core:core:1.7.0'
4+
}

packages/webview/platforms/android/java/com/nativescript/webviewinterface/WebView.java

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
11
package com.nativescript.webviewinterface;
22

3-
public class WebView extends android.webkit.WebView {
3+
import androidx.core.view.NestedScrollingChild;
4+
import androidx.core.view.NestedScrollingChildHelper;
5+
import androidx.core.view.ViewCompat;
6+
import androidx.core.view.MotionEventCompat;
7+
import android.view.MotionEvent;
8+
9+
public class WebView extends android.webkit.WebView implements NestedScrollingChild {
410
boolean mScrollEnabled;
11+
private int mLastY;
12+
private final int[] mScrollOffset = new int[2];
13+
private final int[] mScrollConsumed = new int[2];
14+
private int mNestedOffsetY;
15+
private NestedScrollingChildHelper mChildHelper;
516

617
public WebView(android.content.Context context) {
718
super(context);
819
mScrollEnabled = true;
20+
mChildHelper = new NestedScrollingChildHelper(this);
21+
setNestedScrollingEnabled(true);
922
}
1023

1124
public void setScrollEnabled(boolean value) {
@@ -36,4 +49,97 @@ public void scrollTo(int x, int y) {
3649
super.scrollTo(x, y);
3750
}
3851
}
52+
53+
@Override
54+
public boolean onTouchEvent(MotionEvent ev) {
55+
boolean returnValue = false;
56+
57+
MotionEvent event = MotionEvent.obtain(ev);
58+
final int action = MotionEventCompat.getActionMasked(event);
59+
if (action == MotionEvent.ACTION_DOWN) {
60+
mNestedOffsetY = 0;
61+
}
62+
int eventY = (int) event.getY();
63+
event.offsetLocation(0, mNestedOffsetY);
64+
switch (action) {
65+
case MotionEvent.ACTION_MOVE:
66+
int deltaY = mLastY - eventY;
67+
// NestedPreScroll
68+
if (dispatchNestedPreScroll(0, deltaY, mScrollConsumed, mScrollOffset)) {
69+
deltaY -= mScrollConsumed[1];
70+
mLastY = eventY - mScrollOffset[1];
71+
event.offsetLocation(0, -mScrollOffset[1]);
72+
mNestedOffsetY += mScrollOffset[1];
73+
}
74+
returnValue = super.onTouchEvent(event);
75+
76+
// NestedScroll
77+
if (dispatchNestedScroll(0, mScrollOffset[1], 0, deltaY, mScrollOffset)) {
78+
event.offsetLocation(0, mScrollOffset[1]);
79+
mNestedOffsetY += mScrollOffset[1];
80+
mLastY -= mScrollOffset[1];
81+
}
82+
break;
83+
case MotionEvent.ACTION_DOWN:
84+
returnValue = super.onTouchEvent(event);
85+
mLastY = eventY;
86+
// start NestedScroll
87+
startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
88+
break;
89+
case MotionEvent.ACTION_UP:
90+
case MotionEvent.ACTION_CANCEL:
91+
returnValue = super.onTouchEvent(event);
92+
// end NestedScroll
93+
stopNestedScroll();
94+
break;
95+
}
96+
return returnValue;
97+
}
98+
99+
// Nested Scroll implements
100+
@Override
101+
public void setNestedScrollingEnabled(boolean enabled) {
102+
mChildHelper.setNestedScrollingEnabled(enabled);
103+
}
104+
105+
@Override
106+
public boolean isNestedScrollingEnabled() {
107+
return mChildHelper.isNestedScrollingEnabled();
108+
}
109+
110+
@Override
111+
public boolean startNestedScroll(int axes) {
112+
return mChildHelper.startNestedScroll(axes);
113+
}
114+
115+
@Override
116+
public void stopNestedScroll() {
117+
mChildHelper.stopNestedScroll();
118+
}
119+
120+
@Override
121+
public boolean hasNestedScrollingParent() {
122+
return mChildHelper.hasNestedScrollingParent();
123+
}
124+
125+
@Override
126+
public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed,
127+
int[] offsetInWindow) {
128+
return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow);
129+
}
130+
131+
@Override
132+
public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
133+
return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
134+
}
135+
136+
@Override
137+
public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
138+
return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
139+
}
140+
141+
@Override
142+
public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
143+
return mChildHelper.dispatchNestedPreFling(velocityX, velocityY);
144+
}
39145
}

0 commit comments

Comments
 (0)