Skip to content

Commit f8fa9e4

Browse files
author
farfromrefuge
committed
fix(android): peaking and spacing can work together with improved performances
1 parent 958ed70 commit f8fa9e4

File tree

4 files changed

+31
-25
lines changed

4 files changed

+31
-25
lines changed

packages/ui-pager/platforms/android/java/com/nativescript/pager/PeakingTransformer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55

66
import android.view.View;
77
import android.view.ViewParent;
8+
import android.util.Log;
89

910
public final class PeakingTransformer implements ViewPager2.PageTransformer {
11+
public float pageOffset = 0.0f;
12+
public float pageMargin = 0.0f;
1013
/**
1114
* Creates a {@link PeakingTransformer}.
1215
*
@@ -16,7 +19,7 @@ public PeakingTransformer() {
1619
@Override
1720
public void transformPage(View page, float position) {
1821
ViewPager2 viewPager = requireViewPager(page);
19-
float offset = 0.0005f * position;
22+
float offset = position * -(2 * pageOffset - pageMargin);
2023
boolean isRtl = viewPager.getLayoutDirection() == 1;
2124
if (viewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
2225
page.setTranslationX(isRtl ? -offset : offset);
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
{
22
"uses": [
3-
"androidx.viewpager2.widget:ViewPager2*",
4-
"androidx.viewpager2.widget:CompositePageTransformer*"
3+
"com.nativescript.pager*:*",
4+
"androidx.recyclerview.widget:RecyclerView.Adapter",
5+
"androidx.recyclerview.widget:RecyclerView.ViewHolder",
6+
"androidx.viewpager2.widget:ViewPager2",
7+
"androidx.viewpager2.widget:ViewPager2.OnPageChangeCallback",
8+
"androidx.viewpager2.widget:ViewPager2.PageTransformer",
9+
"androidx.viewpager2.widget:CompositePageTransformer",
10+
"androidx.viewpager2.widget:MarginPageTransformer"
511
]
612
}
713

src/ui-pager/index.android.ts

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ export class Pager extends PagerBase {
4949
public _realizedTemplates = new Map<string, Map<android.view.View, View>>();
5050
lastEvent = 0;
5151
private _lastSpacing = 0;
52-
private _lastPeaking = 0;
52+
_lastPeaking = 0;
5353
private compositeTransformer: androidx.viewpager2.widget.CompositePageTransformer;
54-
private marginTransformer: androidx.viewpager2.widget.MarginPageTransformer;
54+
// private marginTransformer: androidx.viewpager2.widget.MarginPageTransformer;
5555
private peakingTransformer: com.nativescript.pager.PeakingTransformer;
5656
private _transformers: androidx.viewpager2.widget.ViewPager2.PageTransformer[];
5757

@@ -170,18 +170,12 @@ export class Pager extends PagerBase {
170170
const size = this.convertToSize(value);
171171
const newSpacing = size !== this._lastSpacing;
172172
if (newSpacing) {
173-
if (this.marginTransformer) {
174-
this.compositeTransformer.removeTransformer(this.marginTransformer);
175-
this.marginTransformer = null;
176-
}
177-
if (size !== 0) {
178-
this.marginTransformer = new androidx.viewpager2.widget.MarginPageTransformer(size);
179-
this.compositeTransformer.addTransformer(this.marginTransformer);
180-
if (this.peakingTransformer) {
181-
this.compositeTransformer.removeTransformer(this.peakingTransformer);
182-
this.peakingTransformer = null;
183-
}
173+
if (!this.peakingTransformer) {
174+
this.peakingTransformer = new com.nativescript.pager.PeakingTransformer();
175+
this.compositeTransformer.addTransformer(this.peakingTransformer);
184176
}
177+
this.peakingTransformer.pageOffset = this._lastPeaking;
178+
this.peakingTransformer.pageMargin = size;
185179
this._lastSpacing = size;
186180
this.refresh();
187181
}
@@ -191,17 +185,12 @@ export class Pager extends PagerBase {
191185
const size = this.convertToSize(value);
192186
const newPeaking = size !== this._lastPeaking;
193187
if (newPeaking) {
194-
const nativeView = this.nativeViewProtected;
195-
const left = this.orientation === 'horizontal' ? size : 0;
196-
const top = this.orientation === 'horizontal' ? 0 : size;
197-
const enabled = left !== 0 || top !== 0;
198-
nativeView.setPadding(left, top, left, top);
199-
nativeView.setClipChildren(!enabled);
200-
nativeView.setClipToPadding(!enabled);
201-
if (!this.peakingTransformer && !this.marginTransformer) {
188+
if (!this.peakingTransformer) {
202189
this.peakingTransformer = new com.nativescript.pager.PeakingTransformer();
203190
this.compositeTransformer.addTransformer(this.peakingTransformer);
204191
}
192+
this.peakingTransformer.pageOffset = size;
193+
this.peakingTransformer.pageMargin = this._lastSpacing;
205194
this._lastPeaking = size;
206195
this.refresh();
207196
}
@@ -841,6 +830,9 @@ function initPagerRecyclerAdapter() {
841830
(holder.view as ContentView).content = args.view;
842831
}
843832
owner._prepareItem(holder.view, index);
833+
834+
// TODO: find a way to add to existing margin
835+
view.marginLeft = view.marginRight = Utils.layout.toDeviceIndependentPixels(owner._lastPeaking);
844836
}
845837
}
846838

@@ -1025,7 +1017,10 @@ function initPagerViewHolder() {
10251017

10261018
@NativeClass
10271019
class PagerViewHolderImpl extends androidx.recyclerview.widget.RecyclerView.ViewHolder {
1028-
constructor(private owner: View, private pager: WeakRef<Pager>) {
1020+
constructor(
1021+
private owner: View,
1022+
private pager: WeakRef<Pager>
1023+
) {
10291024
super(owner.nativeViewProtected);
10301025
return global.__native(this);
10311026
}

src/ui-pager/typings/android.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ declare namespace com {
22
export namespace nativescript {
33
export namespace pager {
44
export class PeakingTransformer extends ViewPager2.PageTransformer {
5+
pageOffset: number;
6+
pageMargin: number;
57
public static class: java.lang.Class<PeakingTransformer>;
68

79
public transformPage(param0: globalAndroid.view.View, param1: number): void;

0 commit comments

Comments
 (0)