海外の記事なのですが、「React Native ScrollView Example Tutorial」が、写真付きで分かりやすい解説だったので、要約しつつ紹介します。
Krunalさん、とても丁寧な記事をありがとうございます。
ScrollViewを使わない場合
普通にViewの下にTextを並べていくと、FlexCSSによって等間隔にTextが並べられます。
サンプルコード
// App.js import React, { Component } from 'react'; import { StyleSheet, Text, View } from 'react-native'; export default class App extends Component { render() { return ( <View style={styles.container}> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, marginTop: 20, backgroundColor: '#F5FCFF', }, welcome: { flex: 1, margin: 20, backgroundColor: 'orange', margin: 10, textAlign: 'center', fontSize: 20, paddingTop: 70, } });
表示結果
Textの数を増やしてみるとどうなるのか?
それでは、Textの数を増やしてみたらどうなるでしょうか?
サンプルコード
return ( <View style={styles.container}> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> </View> );
表示結果
FlexCSSによって、等間隔の配置は維持されましたが、テキストが表示しきれず、全て隠れてしまいました。
ScrollViewの基本形
それでは早速、ScrollViewを使用して、隠れてしまったテキストを復活させてみましょう。
サンプルコード
// App.js import React, { Component } from 'react'; import { StyleSheet, Text, View, ScrollView } from 'react-native'; export default class App extends Component { render() { return ( <ScrollView> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> </ScrollView> ); } } const styles = StyleSheet.create({ welcome: { flex: 1, margin: 20, backgroundColor: 'orange', margin: 10, textAlign: 'center', fontSize: 20, paddingTop: 70, } });
表示結果
「Welcome to React Native」の文字が復活し、ちゃんと表示されるようになりました!ちなみに、静止画だと伝わりづらいですが、上下にスワイプするとスクロールするようになっています。
スクロールバーを表示したくない場合
「showsVerticalScrollIndicator={false}
」とすることで、スクロールバーを表示しないようにすることができます。
サンプルコード
<ScrollView showsVerticalScrollIndicator={false}> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> </ScrollView>
横スクロールに変更する
「horizontal={true}
」とすることで、横スクロールに対応することもできます。
サンプルコード
return ( <ScrollView horizontal={true}> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> </ScrollView> );
表示結果
静止画だと分かりませんが、指を左右にスワイプすることで、スクロールするようになっています。
応用:画面下だけスクロールさせないで固定する
ScrollViewを応用すると、画面下のbottom領域だけスクロールさせないで固定するといった事が可能です。
サンプルコード
// App.js import React, { Component } from 'react'; import { StyleSheet, Text, View, ScrollView, Dimensions } from 'react-native'; // 画面下の10%だけスクロール領域から外したいので高さを取得しておく const { height } = Dimensions.get("window"); export default class App extends Component { render() { return ( <View style={{ flex: 1 }}> <ScrollView> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> <Text style={styles.welcome}>Welcome to React Native</Text> </ScrollView> <Text style={{ height: height * 0.1 /* 下部10%はスクロール外とする */, backgroundColor: 'blue', color: 'white' }}>Welcome to React Native</Text> </View> ); } } const styles = StyleSheet.create({ welcome: { flex: 1, margin: 20, backgroundColor: 'orange', margin: 10, textAlign: 'center', fontSize: 20, paddingTop: 70, } });
表示結果
静止画だと分かりづらいですが、画面下の青い部分は固定で表示され、それより上のオレンジ色のTextが並んでいる領域だけが、スクロールします。
さいごに
ReactNativeのScrollViewは、わりと素直に実装するだけで、普通に使えることが分かりました。画面に詰め込む要素が多い場合は「ScrollView」は欠かせない存在ですので、今後も活用して行きたいと思います。