From a10a510d968b3068dd2f8923b9abdaf012c62040 Mon Sep 17 00:00:00 2001 From: Felix Oghina Date: Fri, 15 Jan 2016 09:46:34 -0800 Subject: [PATCH] support removeClippedSubviews in ReactHorizontalScrollView Reviewed By: andreicoman11 Differential Revision: D2831013 fb-gh-sync-id: 2ac4eb8d748f2d66523992e8683c1b4d60198ba1 --- .../scroll/ReactHorizontalScrollView.java | 61 ++++++++++++++++++- .../ReactHorizontalScrollViewManager.java | 7 +++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index 298512c6d..c8bdc978a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -9,29 +9,54 @@ package com.facebook.react.views.scroll; +import javax.annotation.Nullable; + import android.content.Context; +import android.graphics.Rect; import android.view.MotionEvent; +import android.view.View; import android.widget.HorizontalScrollView; +import com.facebook.infer.annotation.Assertions; import com.facebook.react.uimanager.MeasureSpecAssertions; import com.facebook.react.uimanager.events.NativeGestureUtil; +import com.facebook.react.views.view.ReactClippingViewGroup; +import com.facebook.react.views.view.ReactClippingViewGroupHelper; /** * Similar to {@link ReactScrollView} but only supports horizontal scrolling. */ -public class ReactHorizontalScrollView extends HorizontalScrollView { +public class ReactHorizontalScrollView extends HorizontalScrollView implements + ReactClippingViewGroup { private final OnScrollDispatchHelper mOnScrollDispatchHelper = new OnScrollDispatchHelper(); + private boolean mRemoveClippedSubviews; private boolean mSendMomentumEvents; private boolean mDragging; private boolean mFlinging; private boolean mDoneFlinging; + private @Nullable Rect mClippingRect; + public ReactHorizontalScrollView(Context context) { super(context); } + @Override + public void setRemoveClippedSubviews(boolean removeClippedSubviews) { + if (removeClippedSubviews && mClippingRect == null) { + mClippingRect = new Rect(); + } + mRemoveClippedSubviews = removeClippedSubviews; + updateClippingRect(); + } + + @Override + public boolean getRemoveClippedSubviews() { + return mRemoveClippedSubviews; + } + public void setSendMomentumEvents(boolean sendMomentumEvents) { mSendMomentumEvents = sendMomentumEvents; } @@ -56,9 +81,14 @@ public class ReactHorizontalScrollView extends HorizontalScrollView { super.onScrollChanged(x, y, oldX, oldY); if (mOnScrollDispatchHelper.onScrollChanged(x, y)) { + if (mRemoveClippedSubviews) { + updateClippingRect(); + } + if (mFlinging) { mDoneFlinging = false; } + ReactScrollViewHelper.emitScrollEvent(this); } } @@ -106,4 +136,33 @@ public class ReactHorizontalScrollView extends HorizontalScrollView { postOnAnimationDelayed(r, ReactScrollViewHelper.MOMENTUM_DELAY); } } + + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (mRemoveClippedSubviews) { + updateClippingRect(); + } + } + + @Override + public void updateClippingRect() { + if (!mRemoveClippedSubviews) { + return; + } + + Assertions.assertNotNull(mClippingRect); + + ReactClippingViewGroupHelper.calculateClippingRect(this, mClippingRect); + View contentView = getChildAt(0); + if (contentView instanceof ReactClippingViewGroup) { + ((ReactClippingViewGroup) contentView).updateClippingRect(); + } + } + + @Override + public void getClippingRect(Rect outClippingRect) { + outClippingRect.set(Assertions.assertNotNull(mClippingRect)); + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java index 972a88acd..07a39d4a4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java @@ -15,6 +15,7 @@ import com.facebook.react.bridge.ReadableArray; import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.views.view.ReactClippingViewGroupHelper; /** * View manager for {@link ReactHorizontalScrollView} components. @@ -38,6 +39,12 @@ public class ReactHorizontalScrollViewManager return new ReactHorizontalScrollView(context); } + @ReactProp(name = ReactClippingViewGroupHelper.PROP_REMOVE_CLIPPED_SUBVIEWS) + public void setRemoveClippedSubviews(ReactHorizontalScrollView view, boolean removeClippedSubviews) { + view.setRemoveClippedSubviews(removeClippedSubviews); + } + + @ReactProp(name = "showsHorizontalScrollIndicator") public void setShowsHorizontalScrollIndicator(ReactHorizontalScrollView view, boolean value) { view.setHorizontalScrollBarEnabled(value);