Skip to content

Commit 261ae39

Browse files
authored
fix(android): support negative values for pageMargin (#301)
Supporting negative values let's us have pages peek from the previous and next pages.
1 parent b58deb4 commit 261ae39

File tree

5 files changed

+26
-10
lines changed

5 files changed

+26
-10
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ yarn lint --fix
180180
- `flex:1` does not work for child views, please use `width:”100%”, height:”100%” ` [instead](https://github.com/react-native-community/react-native-viewpager/issues/186#issuecomment-675320732)
181181

182182
- [iOS]: In case of `UIViewControllerHierarchyInconsistency` error, please use below fix:
183-
183+
184184
```
185185
requestAnimationFrame(() => refViewPager.current?.setPage(index));
186186
```

android/gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
ReactNativeViewPager_compileSdkVersion=28
22
ReactNativeViewPager_buildToolsVersion=28.0.3
33
ReactNativeViewPager_targetSdkVersion=27
4-
ReactNativeViewPager_minSdkVersion=16
4+
ReactNativeViewPager_minSdkVersion=17
55

66
android.enableJetifier=true
7-
android.useAndroidX=true
7+
android.useAndroidX=true

android/src/main/java/com/reactnativecommunity/viewpager/ReactViewPagerManager.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@
55

66
package com.reactnativecommunity.viewpager;
77

8-
import android.util.SparseArray;
98
import android.view.View;
109

1110
import androidx.annotation.NonNull;
1211
import androidx.annotation.Nullable;
1312

1413
import androidx.fragment.app.FragmentActivity;
15-
import androidx.viewpager2.adapter.FragmentStateAdapter;
16-
import androidx.viewpager2.widget.MarginPageTransformer;
1714
import androidx.viewpager2.widget.ViewPager2;
1815

1916
import com.facebook.infer.annotation.Assertions;
@@ -235,8 +232,25 @@ public void receiveCommand(@NonNull final ViewPager2 root, int commandId, @Nulla
235232

236233
@ReactProp(name = "pageMargin", defaultFloat = 0)
237234
public void setPageMargin(ViewPager2 pager, float margin) {
238-
int pageMargin = (int) PixelUtil.toPixelFromDIP(margin);
239-
pager.setPageTransformer(new MarginPageTransformer(pageMargin));
235+
final int pageMargin = (int) PixelUtil.toPixelFromDIP(margin);
236+
final ViewPager2 vp = pager;
237+
238+
/**
239+
* Don't use MarginPageTransformer to be able to support negative margins
240+
*/
241+
pager.setPageTransformer(new ViewPager2.PageTransformer() {
242+
@Override
243+
public void transformPage(@NonNull View page, float position) {
244+
float offset = pageMargin * position;
245+
246+
if (vp.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
247+
boolean isRTL = vp.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
248+
249+
page.setTranslationX(isRTL ? -offset : offset);
250+
} else {
251+
page.setTranslationY(offset);
252+
}
253+
}
254+
});
240255
}
241256
}
242-

example/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
buildscript {
44
ext {
55
buildToolsVersion = "29.0.2"
6-
minSdkVersion = 16
6+
minSdkVersion = 17
77
compileSdkVersion = 29
88
targetSdkVersion = 29
99
}

src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ export interface ViewPagerProps {
8484
* be recreated from the adapter when needed.
8585
* Defaults to RecyclerView's caching strategy.
8686
* The given value must either be larger than 0.
87+
*
88+
* Only supported on Android.
8789
*/
8890
offscreenPageLimit?: number;
8991

0 commit comments

Comments
 (0)