Implement FabricViewStateManager for ReactScrollView

Summary:
Implement FabricViewStateManager for ReactScrollView.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D22941070

fbshipit-source-id: d464f48aabecd7684558271f2b734b416ed15998
This commit is contained in:
Joshua Gross 2020-08-05 01:42:19 -07:00 коммит произвёл Facebook GitHub Bot
Родитель 534f0aefae
Коммит 33bccbe2ec
2 изменённых файлов: 21 добавлений и 17 удалений

Просмотреть файл

@ -31,11 +31,11 @@ import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeMap;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.config.ReactFeatureFlags;
import com.facebook.react.uimanager.FabricViewStateManager;
import com.facebook.react.uimanager.MeasureSpecAssertions;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.ReactClippingViewGroup;
import com.facebook.react.uimanager.ReactClippingViewGroupHelper;
import com.facebook.react.uimanager.StateWrapper;
import com.facebook.react.uimanager.ViewProps;
import com.facebook.react.uimanager.events.NativeGestureUtil;
import com.facebook.react.views.view.ReactViewBackgroundManager;
@ -52,7 +52,8 @@ import java.util.List;
public class ReactScrollView extends ScrollView
implements ReactClippingViewGroup,
ViewGroup.OnHierarchyChangeListener,
View.OnLayoutChangeListener {
View.OnLayoutChangeListener,
FabricViewStateManager.HasFabricViewStateManager {
private static @Nullable Field sScrollerField;
private static boolean sTriedToGetScrollerField = false;
@ -89,7 +90,7 @@ public class ReactScrollView extends ScrollView
private ReactViewBackgroundManager mReactBackgroundManager;
private int pendingContentOffsetX = UNSET_CONTENT_OFFSET;
private int pendingContentOffsetY = UNSET_CONTENT_OFFSET;
private @Nullable StateWrapper mStateWrapper;
private final FabricViewStateManager mFabricViewStateManager = new FabricViewStateManager();
private @Nullable ValueAnimator mScrollAnimator;
private int mFinalAnimatedPositionScrollX;
@ -956,18 +957,10 @@ public class ReactScrollView extends ScrollView
mReactBackgroundManager.setBorderStyle(style);
}
public void updateState(@Nullable StateWrapper stateWrapper) {
mStateWrapper = stateWrapper;
}
/**
* Called on any stabilized onScroll change to propagate content offset value to a Shadow Node.
*/
private void updateStateOnScroll(int scrollX, int scrollY) {
if (mStateWrapper == null) {
return;
}
private void updateStateOnScroll(final int scrollX, final int scrollY) {
// Dedupe events to reduce JNI traffic
if (scrollX == mLastStateUpdateScrollX && scrollY == mLastStateUpdateScrollY) {
return;
@ -976,14 +969,25 @@ public class ReactScrollView extends ScrollView
mLastStateUpdateScrollX = scrollX;
mLastStateUpdateScrollY = scrollY;
WritableMap map = new WritableNativeMap();
map.putDouble(CONTENT_OFFSET_LEFT, PixelUtil.toDIPFromPixel(scrollX));
map.putDouble(CONTENT_OFFSET_TOP, PixelUtil.toDIPFromPixel(scrollY));
mFabricViewStateManager.setState(
new FabricViewStateManager.StateUpdateCallback() {
@Override
public WritableMap getStateUpdate() {
mStateWrapper.updateState(map);
WritableMap map = new WritableNativeMap();
map.putDouble(CONTENT_OFFSET_LEFT, PixelUtil.toDIPFromPixel(scrollX));
map.putDouble(CONTENT_OFFSET_TOP, PixelUtil.toDIPFromPixel(scrollY));
return map;
}
});
}
private void updateStateOnScroll() {
updateStateOnScroll(getScrollX(), getScrollY());
}
@Override
public FabricViewStateManager getFabricViewStateManager() {
return mFabricViewStateManager;
}
}

Просмотреть файл

@ -319,7 +319,7 @@ public class ReactScrollViewManager extends ViewGroupManager<ReactScrollView>
@Override
public Object updateState(
ReactScrollView view, ReactStylesDiffMap props, @Nullable StateWrapper stateWrapper) {
view.updateState(stateWrapper);
view.getFabricViewStateManager().setStateWrapper(stateWrapper);
return null;
}