Skip to content

Commit

Permalink
Implement fading edges for ScrollView and it's dependent FlatList (#2…
Browse files Browse the repository at this point in the history
…6163)

Summary:
This should add props for enabling horizontal and vertical fading
edges for Scrollview and FlatList.
These fading edges are used to communicate to the user that there is more content to see.

## Changelog

[Android] [Added] - fading edges props to the FlatList and ScrollView components
Pull Request resolved: #26163

Test Plan:
Open the React Native test app and navigate to the FlatList section.
Enable the `useFadingEdges` switch and insert a number into `Fading edge length`.

![device-2019-08-23-123745](https://user-images.githubusercontent.com/222393/63587150-7385cb00-c5a3-11e9-98dc-bffe8276d30c.png)
![device-2019-08-23-123844](https://user-images.githubusercontent.com/222393/63587156-75e82500-c5a3-11e9-9e9f-66876ac8f506.png)

Differential Revision: D16992488

Pulled By: sahrens

fbshipit-source-id: f72a9a890d9056bb017cc5747c6f66b7c35633dd
  • Loading branch information
André Krüger authored and facebook-github-bot committed Aug 23, 2019
1 parent 41525c0 commit f8a64f9
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 1 deletion.
21 changes: 21 additions & 0 deletions Libraries/Components/ScrollView/ScrollView.js
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,27 @@ type AndroidProps = $ReadOnly<{|
* @platform android
*/
persistentScrollbar?: ?boolean,
/**
* Fades out the left and right edges.
* The default value is false.
*
* @platform android
*/
horizontalFadingEdgesEnabled?: ?boolean,
/**
* Fades out the up and down edges.
* The default value is false.
*
* @platform android
*/
verticalFadingEdgesEnabled?: ?boolean,
/**
* The amount of fading.
* The default value is 0.
*
* @platform android
*/
fadingEdgeLength?: ?number,
|}>;

type VRProps = $ReadOnly<{|
Expand Down
12 changes: 12 additions & 0 deletions Libraries/Lists/FlatList.js
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,18 @@ type OptionalProps<ItemT> = {
* will be called when its corresponding ViewabilityConfig's conditions are met.
*/
viewabilityConfigCallbackPairs?: Array<ViewabilityConfigCallbackPair>,
/**
* See `ScrollView` for flow type and further documentation.
*/
horizontalFadingEdgesEnabled?: ?boolean,
/**
* See `ScrollView` for flow type and further documentation.
*/
verticalFadingEdgesEnabled?: ?boolean,
/**
* See `ScrollView` for flow type and further documentation.
*/
fadingEdgeLength?: ?number,
};
export type Props<ItemT> = RequiredProps<ItemT> &
OptionalProps<ItemT> &
Expand Down
31 changes: 30 additions & 1 deletion RNTester/js/examples/FlatList/FlatListExample.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,14 @@ const {
pressItem,
renderSmallSwitchOption,
} = require('../../components/ListExampleShared');
const {Alert, Animated, StyleSheet, View} = require('react-native');
const {
Alert,
Animated,
Platform,
StyleSheet,
TextInput,
View,
} = require('react-native');

import type {Item} from '../../components/ListExampleShared';

Expand All @@ -51,6 +58,8 @@ type State = {|
virtualized: boolean,
empty: boolean,
useFlatListItemComponent: boolean,
useFadingEdges: boolean,
fadingEdgeLength: number,
|};

class FlatListExample extends React.PureComponent<Props, State> {
Expand All @@ -65,6 +74,8 @@ class FlatListExample extends React.PureComponent<Props, State> {
virtualized: true,
empty: false,
useFlatListItemComponent: false,
useFadingEdges: false,
fadingEdgeLength: 0,
};

_onChangeFilterText = filterText => {
Expand Down Expand Up @@ -124,11 +135,29 @@ class FlatListExample extends React.PureComponent<Props, State> {
{renderSmallSwitchOption(this, 'empty')}
{renderSmallSwitchOption(this, 'debug')}
{renderSmallSwitchOption(this, 'useFlatListItemComponent')}
{Platform.OS === 'android' && (
<View>
{renderSmallSwitchOption(this, 'useFadingEdges')}
<TextInput
placeholder="Fading edge length"
underlineColorAndroid="black"
keyboardType={'numeric'}
onChange={event =>
this.setState({
fadingEdgeLength: Number(event.nativeEvent.text),
})
}
/>
</View>
)}
<Spindicator value={this._scrollPos} />
</View>
</View>
<SeparatorComponent />
<Animated.FlatList
horizontalFadingEdgesEnabled={this.state.useFadingEdges}
verticalFadingEdgesEnabled={this.state.useFadingEdges}
fadingEdgeLength={this.state.fadingEdgeLength}
ItemSeparatorComponent={ItemSeparatorComponent}
ListHeaderComponent={<HeaderComponent />}
ListFooterComponent={FooterComponent}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,4 +276,14 @@ public void setOverflow(ReactHorizontalScrollView view, @Nullable String overflo
public void setPersistentScrollbar(ReactHorizontalScrollView view, boolean value) {
view.setScrollbarFadingEnabled(!value);
}

@ReactProp(name = "horizontalFadingEdgesEnabled")
public void setHorizontalFadingEdgesEnabled(ReactHorizontalScrollView view, boolean value) {
view.setHorizontalFadingEdgeEnabled(value);
}

@ReactProp(name = "fadingEdgeLength")
public void setFadingEdgeLength(ReactHorizontalScrollView view, int value) {
view.setFadingEdgeLength(value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,16 @@ public void setPersistentScrollbar(ReactScrollView view, boolean value) {
view.setScrollbarFadingEnabled(!value);
}

@ReactProp(name = "verticalFadingEdgesEnabled")
public void setVerticalFadingEdgesEnabled(ReactScrollView view, boolean value) {
view.setVerticalFadingEdgeEnabled(value);
}

@ReactProp(name = "fadingEdgeLength")
public void setFadingEdgeLength(ReactScrollView view, int value) {
view.setFadingEdgeLength(value);
}

@Override
public @Nullable Map<String, Object> getExportedCustomDirectEventTypeConstants() {
return createExportedCustomDirectEventTypeConstants();
Expand Down

0 comments on commit f8a64f9

Please sign in to comment.