Skip to content
This repository was archived by the owner on Dec 3, 2021. It is now read-only.

Commit 0b6d361

Browse files
dmitrynyenda
authored andcommitted
Add "contentOffset" property to ScrollView
1 parent 44bfffb commit 0b6d361

2 files changed

Lines changed: 35 additions & 1 deletion

File tree

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@
3333

3434
import java.lang.reflect.Field;
3535
import java.util.List;
36+
import java.util.HashMap;
3637
import javax.annotation.Nullable;
3738

39+
3840
/**
3941
* A simple subclass of ScrollView that doesn't dispatch measure and layout to its children and has
4042
* a scroll listener to send scroll events to JS.
@@ -71,6 +73,7 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou
7173
private @Nullable List<Integer> mSnapOffsets;
7274
private View mContentView;
7375
private ReactViewBackgroundManager mReactBackgroundManager;
76+
private HashMap<String, Integer> mContentOffset = null;
7477

7578
public ReactScrollView(ReactContext context) {
7679
this(context, null);
@@ -175,10 +178,20 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
175178
MeasureSpec.getSize(heightMeasureSpec));
176179
}
177180

181+
public void setContentOffset(HashMap<String, Integer> contentOffset) {
182+
mContentOffset = contentOffset;
183+
}
184+
178185
@Override
179186
protected void onLayout(boolean changed, int l, int t, int r, int b) {
180187
// Call with the present values in order to re-layout if necessary
181-
scrollTo(getScrollX(), getScrollY());
188+
// If contentOffset is set scroll to its position
189+
if (mContentOffset != null) {
190+
scrollTo(mContentOffset.get("x"), mContentOffset.get("y"));
191+
} else {
192+
// Call with the present values in order to re-layout if necessary
193+
scrollTo(getScrollX(), getScrollY());
194+
}
182195
}
183196

184197
@Override

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.util.DisplayMetrics;
1414

1515
import com.facebook.react.bridge.ReadableArray;
16+
import com.facebook.react.bridge.ReadableMap;
1617
import com.facebook.react.common.MapBuilder;
1718
import com.facebook.react.module.annotations.ReactModule;
1819
import com.facebook.react.uimanager.DisplayMetricsHolder;
@@ -28,6 +29,7 @@
2829

2930
import java.util.ArrayList;
3031
import java.util.List;
32+
import java.util.HashMap;
3133
import java.util.Map;
3234
import javax.annotation.Nullable;
3335

@@ -211,6 +213,25 @@ public void setBorderStyle(ReactScrollView view, @Nullable String borderStyle) {
211213
view.setBorderStyle(borderStyle);
212214
}
213215

216+
/**
217+
* When set, the scrollview will scroll to the given position on initial layout
218+
* @param view
219+
* @param contentOffset
220+
*/
221+
@ReactProp(name = "contentOffset")
222+
public void setContentOffset(ReactScrollView view, ReadableMap contentOffset) {
223+
if (!contentOffset.hasKey("x") || !contentOffset.hasKey("y")) {
224+
return;
225+
}
226+
int destX = Math.round(PixelUtil.toPixelFromDIP(contentOffset.getDouble("x")));
227+
int destY = Math.round(PixelUtil.toPixelFromDIP(contentOffset.getDouble("y")));
228+
229+
HashMap<String, Integer> initialOffset = new HashMap<String, Integer>();
230+
initialOffset.put("x", destX);
231+
initialOffset.put("y", destY);
232+
view.setContentOffset(initialOffset);
233+
}
234+
214235
@ReactPropGroup(names = {
215236
ViewProps.BORDER_WIDTH,
216237
ViewProps.BORDER_LEFT_WIDTH,

0 commit comments

Comments
 (0)