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:
Родитель
534f0aefae
Коммит
33bccbe2ec
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче