Skip to content

Commit ad5361f

Browse files
jettbowfacebook-github-bot
authored andcommitted
Add support for custom fading edges to LazyList/Grid/StaggeredGrid
Summary: Support custom fading edges Reviewed By: adityasharat Differential Revision: D62023833 fbshipit-source-id: f50adcf4eb62e9b4ce520248989689cc1a48e628
1 parent d0cf0a4 commit ad5361f

File tree

8 files changed

+137
-0
lines changed

8 files changed

+137
-0
lines changed

litho-sections-widget/src/main/java/com/facebook/litho/sections/widget/RecyclerCollectionComponentSpec.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ public class RecyclerCollectionComponentSpec {
140140
@PropDefault public static final boolean incrementalMount = true;
141141
@PropDefault public static final int refreshProgressBarColor = 0XFF4267B2; // blue
142142

143+
@PropDefault public static final boolean isLeftFadingEnabled = true;
144+
@PropDefault public static final boolean isRightFadingEnabled = true;
145+
@PropDefault public static final boolean isTopFadingEnabled = true;
146+
@PropDefault public static final boolean isBottomFadingEnabled = true;
147+
143148
@OnCreateLayout
144149
static @Nullable Component onCreateLayout(
145150
final ComponentContext c,
@@ -168,6 +173,10 @@ public class RecyclerCollectionComponentSpec {
168173
@Prop(optional = true) EventHandler<TouchEvent> recyclerTouchEventHandler,
169174
@Prop(optional = true) boolean horizontalFadingEdgeEnabled,
170175
@Prop(optional = true) boolean verticalFadingEdgeEnabled,
176+
@Prop(optional = true) boolean isLeftFadingEnabled,
177+
@Prop(optional = true) boolean isRightFadingEnabled,
178+
@Prop(optional = true) boolean isTopFadingEnabled,
179+
@Prop(optional = true) boolean isBottomFadingEnabled,
171180
@Prop(optional = true, resType = ResType.DIMEN_SIZE) int fadingEdgeLength,
172181
@Prop(optional = true, resType = ResType.COLOR) @Nullable
173182
Integer refreshProgressBarBackgroundColor,
@@ -283,6 +292,10 @@ public class RecyclerCollectionComponentSpec {
283292
itemDecorations,
284293
horizontalFadingEdgeEnabled,
285294
verticalFadingEdgeEnabled,
295+
isLeftFadingEnabled,
296+
isRightFadingEnabled,
297+
isTopFadingEnabled,
298+
isBottomFadingEnabled,
286299
fadingEdgeLength,
287300
edgeEffectFactory,
288301
recyclerViewId,

litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/CollectionRecyclerSpec.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ object CollectionRecyclerSpec {
6161
val recyclerConfiguration: RecyclerConfiguration = ListRecyclerConfiguration.create().build()
6262

6363
@PropDefault val itemAnimator: RecyclerView.ItemAnimator = NoUpdateItemAnimator()
64+
@PropDefault val isLeftFadingEnabled: Boolean = true
65+
@PropDefault val isRightFadingEnabled: Boolean = true
66+
@PropDefault val isTopFadingEnabled: Boolean = true
67+
@PropDefault val isBottomFadingEnabled: Boolean = true
6468

6569
@JvmStatic
6670
@OnCreateLayout
@@ -84,6 +88,10 @@ object CollectionRecyclerSpec {
8488
@Prop(optional = true) recyclerTouchEventHandler: EventHandler<TouchEvent>?,
8589
@Prop(optional = true) horizontalFadingEdgeEnabled: Boolean,
8690
@Prop(optional = true) verticalFadingEdgeEnabled: Boolean,
91+
@Prop(optional = true) isLeftFadingEnabled: Boolean,
92+
@Prop(optional = true) isRightFadingEnabled: Boolean,
93+
@Prop(optional = true) isTopFadingEnabled: Boolean,
94+
@Prop(optional = true) isBottomFadingEnabled: Boolean,
8795
@Prop(optional = true, resType = ResType.DIMEN_SIZE) fadingEdgeLength: Int,
8896
@Prop(optional = true, resType = ResType.COLOR) refreshProgressBarBackgroundColor: Int?,
8997
@Prop(optional = true, resType = ResType.COLOR) refreshProgressBarColor: Int?,
@@ -151,6 +159,10 @@ object CollectionRecyclerSpec {
151159
itemDecorations = itemDecoration?.let { listOf(it) },
152160
isHorizontalFadingEdgeEnabled = horizontalFadingEdgeEnabled,
153161
isVerticalFadingEdgeEnabled = verticalFadingEdgeEnabled,
162+
isLeftFadingEnabled = isLeftFadingEnabled,
163+
isRightFadingEnabled = isRightFadingEnabled,
164+
isTopFadingEnabled = isTopFadingEnabled,
165+
isBottomFadingEnabled = isBottomFadingEnabled,
154166
fadingEdgeLength = fadingEdgeLength,
155167
onScrollListeners = onScrollListeners?.filterNotNull(),
156168
refreshProgressBarBackgroundColor = refreshProgressBarBackgroundColor,

litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/LazyCollection.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ class LazyCollection(
8787
private val onDataRendered: OnDataRendered? = null,
8888
private val childEquivalenceIncludesCommonProps: Boolean = true,
8989
private val alwaysDetectDuplicates: Boolean = false,
90+
private val isLeftFadingEnabled: Boolean = true,
91+
private val isRightFadingEnabled: Boolean = true,
92+
private val isTopFadingEnabled: Boolean = true,
93+
private val isBottomFadingEnabled: Boolean = true,
9094
private val fadingEdgeLength: Dimen? = null,
9195
private val shouldExcludeFromIncrementalMount: Boolean = false,
9296
private val lazyCollectionChildren: LazyCollectionChildren
@@ -200,6 +204,10 @@ class LazyCollection(
200204
} else {
201205
horizontalFadingEdgeEnabled(true)
202206
}
207+
isLeftFadingEnabled(isLeftFadingEnabled)
208+
isRightFadingEnabled(isRightFadingEnabled)
209+
isTopFadingEnabled(isTopFadingEnabled)
210+
isBottomFadingEnabled(isBottomFadingEnabled)
203211
}
204212
}
205213
.kotlinStyle(style)

litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/LazyGrid.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ inline fun ResourcesScope.LazyGrid(
6767
useBackgroundChangeSets: Boolean = false,
6868
childEquivalenceIncludesCommonProps: Boolean = true,
6969
alwaysDetectDuplicates: Boolean = false,
70+
isLeftFadingEnabled: Boolean = true,
71+
isRightFadingEnabled: Boolean = true,
72+
isTopFadingEnabled: Boolean = true,
73+
isBottomFadingEnabled: Boolean = true,
7074
fadingEdgeLength: Dimen? = null,
7175
preAllocationHandler: PreAllocationHandler? =
7276
context.lithoConfiguration.componentsConfig.preAllocationHandler,
@@ -118,6 +122,10 @@ inline fun ResourcesScope.LazyGrid(
118122
onDataRendered,
119123
childEquivalenceIncludesCommonProps,
120124
alwaysDetectDuplicates,
125+
isLeftFadingEnabled,
126+
isRightFadingEnabled,
127+
isTopFadingEnabled,
128+
isBottomFadingEnabled,
121129
fadingEdgeLength,
122130
shouldExcludeFromIncrementalMount,
123131
lazyGridScope.children)

litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/LazyList.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ inline fun ResourcesScope.LazyList(
7070
context.lithoConfiguration.componentsConfig.preAllocationHandler,
7171
childEquivalenceIncludesCommonProps: Boolean = true,
7272
alwaysDetectDuplicates: Boolean = false,
73+
isLeftFadingEnabled: Boolean = true,
74+
isRightFadingEnabled: Boolean = true,
75+
isTopFadingEnabled: Boolean = true,
76+
isBottomFadingEnabled: Boolean = true,
7377
fadingEdgeLength: Dimen? = null,
7478
shouldExcludeFromIncrementalMount: Boolean = false,
7579
isCircular: Boolean = false,
@@ -123,6 +127,10 @@ inline fun ResourcesScope.LazyList(
123127
onDataRendered,
124128
childEquivalenceIncludesCommonProps,
125129
alwaysDetectDuplicates,
130+
isLeftFadingEnabled,
131+
isRightFadingEnabled,
132+
isTopFadingEnabled,
133+
isBottomFadingEnabled,
126134
fadingEdgeLength,
127135
shouldExcludeFromIncrementalMount,
128136
lazyListScope.children)

litho-widget-kotlin/src/main/kotlin/com/facebook/litho/widget/collection/LazyStaggeredGrid.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ inline fun ResourcesScope.LazyStaggeredGrid(
7070
isIncrementalMountEnabled: Boolean = true,
7171
childEquivalenceIncludesCommonProps: Boolean = true,
7272
alwaysDetectDuplicates: Boolean = false,
73+
isLeftFadingEnabled: Boolean = true,
74+
isRightFadingEnabled: Boolean = true,
75+
isTopFadingEnabled: Boolean = true,
76+
isBottomFadingEnabled: Boolean = true,
7377
fadingEdgeLength: Dimen? = null,
7478
preAllocationHandler: PreAllocationHandler? =
7579
context.lithoConfiguration.componentsConfig.preAllocationHandler,
@@ -124,6 +128,10 @@ inline fun ResourcesScope.LazyStaggeredGrid(
124128
onDataRendered,
125129
childEquivalenceIncludesCommonProps,
126130
alwaysDetectDuplicates,
131+
isLeftFadingEnabled,
132+
isRightFadingEnabled,
133+
isTopFadingEnabled,
134+
isBottomFadingEnabled,
127135
fadingEdgeLength,
128136
shouldExcludeFromIncrementalMount,
129137
lazyStaggeredGridScope.children)

litho-widget/src/main/java/com/facebook/litho/widget/LithoRecyclerView.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
*/
3232
public class LithoRecyclerView extends RecyclerView implements HasPostDispatchDrawListener {
3333

34+
private boolean mLeftFadingEnabled = true;
35+
private boolean mRightFadingEnabled = true;
36+
private boolean mTopFadingEnabled = true;
37+
private boolean mBottomFadingEnabled = true;
3438
private @Nullable TouchInterceptor mTouchInterceptor;
3539
private @Nullable List<PostDispatchDrawListener> mPostDispatchDrawListeners;
3640

@@ -99,6 +103,58 @@ public void unregisterPostDispatchDrawListener(PostDispatchDrawListener listener
99103
}
100104
}
101105

106+
public void setLeftFadingEnabled(boolean leftFadingEnabled) {
107+
this.mLeftFadingEnabled = leftFadingEnabled;
108+
}
109+
110+
public void setRightFadingEnabled(boolean rightFadingEnabled) {
111+
this.mRightFadingEnabled = rightFadingEnabled;
112+
}
113+
114+
public void setTopFadingEnabled(boolean topFadingEnabled) {
115+
this.mTopFadingEnabled = topFadingEnabled;
116+
}
117+
118+
public void setBottomFadingEnabled(boolean bottomFadingEnabled) {
119+
this.mBottomFadingEnabled = bottomFadingEnabled;
120+
}
121+
122+
@Override
123+
public float getLeftFadingEdgeStrength() {
124+
if (mLeftFadingEnabled) {
125+
return super.getLeftFadingEdgeStrength();
126+
} else {
127+
return 0f;
128+
}
129+
}
130+
131+
@Override
132+
public float getRightFadingEdgeStrength() {
133+
if (mRightFadingEnabled) {
134+
return super.getRightFadingEdgeStrength();
135+
} else {
136+
return 0f;
137+
}
138+
}
139+
140+
@Override
141+
public float getTopFadingEdgeStrength() {
142+
if (mTopFadingEnabled) {
143+
return super.getTopFadingEdgeStrength();
144+
} else {
145+
return 0f;
146+
}
147+
}
148+
149+
@Override
150+
public float getBottomFadingEdgeStrength() {
151+
if (mBottomFadingEnabled) {
152+
return super.getBottomFadingEdgeStrength();
153+
} else {
154+
return 0f;
155+
}
156+
}
157+
102158
/** Allows to override {@link #onInterceptTouchEvent(MotionEvent)} behavior */
103159
public interface TouchInterceptor {
104160

litho-widget/src/main/java/com/facebook/litho/widget/Recycler.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ constructor(
6969
private val itemDecorations: List<RecyclerView.ItemDecoration>? = null,
7070
private val isHorizontalFadingEdgeEnabled: Boolean = false,
7171
private val isVerticalFadingEdgeEnabled: Boolean = false,
72+
private val isLeftFadingEnabled: Boolean = true,
73+
private val isRightFadingEnabled: Boolean = true,
74+
private val isTopFadingEnabled: Boolean = true,
75+
private val isBottomFadingEnabled: Boolean = true,
7276
private val fadingEdgeLength: Int = 0,
7377
private val edgeFactory: RecyclerView.EdgeEffectFactory? = null,
7478
@IdRes private val recyclerViewId: Int = View.NO_ID,
@@ -196,6 +200,10 @@ constructor(
196200
scrollBarStyle = scrollBarStyle,
197201
isHorizontalFadingEdgeEnabled = isHorizontalFadingEdgeEnabled,
198202
isVerticalFadingEdgeEnabled = isVerticalFadingEdgeEnabled,
203+
isLeftFadingEnabled = isLeftFadingEnabled,
204+
isRightFadingEnabled = isRightFadingEnabled,
205+
isTopFadingEnabled = isTopFadingEnabled,
206+
isBottomFadingEnabled = isBottomFadingEnabled,
199207
fadingEdgeLength = fadingEdgeLength,
200208
recyclerViewId = recyclerViewId,
201209
overScrollMode = overScrollMode,
@@ -326,6 +334,10 @@ constructor(
326334
scrollBarStyle = scrollBarStyle,
327335
isHorizontalFadingEdgeEnabled = isHorizontalFadingEdgeEnabled,
328336
isVerticalFadingEdgeEnabled = isVerticalFadingEdgeEnabled,
337+
isLeftFadingEnabled = isLeftFadingEnabled,
338+
isRightFadingEnabled = isRightFadingEnabled,
339+
isTopFadingEnabled = isTopFadingEnabled,
340+
isBottomFadingEnabled = isBottomFadingEnabled,
329341
fadingEdgeLength = fadingEdgeLength,
330342
recyclerViewId = recyclerViewId,
331343
overScrollMode = overScrollMode,
@@ -447,6 +459,10 @@ constructor(
447459
scrollBarStyle = scrollBarStyle,
448460
isHorizontalFadingEdgeEnabled = isHorizontalFadingEdgeEnabled,
449461
isVerticalFadingEdgeEnabled = isVerticalFadingEdgeEnabled,
462+
isLeftFadingEnabled = isLeftFadingEnabled,
463+
isRightFadingEnabled = isRightFadingEnabled,
464+
isTopFadingEnabled = isTopFadingEnabled,
465+
isBottomFadingEnabled = isBottomFadingEnabled,
450466
fadingEdgeLength = fadingEdgeLength,
451467
recyclerViewId = recyclerViewId,
452468
overScrollMode = overScrollMode,
@@ -554,6 +570,10 @@ private fun ResourcesScope.bindLegacyMountBinder(
554570
scrollBarStyle: Int,
555571
isHorizontalFadingEdgeEnabled: Boolean,
556572
isVerticalFadingEdgeEnabled: Boolean,
573+
isLeftFadingEnabled: Boolean,
574+
isRightFadingEnabled: Boolean,
575+
isTopFadingEnabled: Boolean,
576+
isBottomFadingEnabled: Boolean,
557577
fadingEdgeLength: Int,
558578
@IdRes recyclerViewId: Int,
559579
overScrollMode: Int,
@@ -579,6 +599,10 @@ private fun ResourcesScope.bindLegacyMountBinder(
579599
recyclerView.scrollBarStyle = scrollBarStyle
580600
recyclerView.isHorizontalFadingEdgeEnabled = isHorizontalFadingEdgeEnabled
581601
recyclerView.isVerticalFadingEdgeEnabled = isVerticalFadingEdgeEnabled
602+
recyclerView.setLeftFadingEnabled(isLeftFadingEnabled)
603+
recyclerView.setRightFadingEnabled(isRightFadingEnabled)
604+
recyclerView.setTopFadingEnabled(isTopFadingEnabled)
605+
recyclerView.setBottomFadingEnabled(isBottomFadingEnabled)
582606
recyclerView.setFadingEdgeLength(fadingEdgeLength.dp.toPixels())
583607
recyclerView.id = recyclerViewId
584608
recyclerView.overScrollMode = overScrollMode

0 commit comments

Comments
 (0)