/** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * The examples provided by Facebook are for non-commercial testing and * evaluation purposes only. * * Facebook reserves all rights not expressly granted. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * @flow * @providesModule NativeAnimationsExample */ 'use strict'; const React = require('react'); const ReactNative = require('react-native'); const { View, Text, Animated, StyleSheet, TouchableWithoutFeedback, Slider, } = ReactNative; var AnimatedSlider = Animated.createAnimatedComponent(Slider); class Tester extends React.Component { state = { native: new Animated.Value(0), js: new Animated.Value(0), }; current = 0; onPress = () => { const animConfig = ( this.current && this.props.reverseConfig ? this.props.reverseConfig : this.props.config ); this.current = this.current ? 0 : 1; const config = { ...animConfig, toValue: this.current, }; Animated[this.props.type](this.state.native, { ...config, useNativeDriver: true }).start(); Animated[this.props.type](this.state.js, { ...config, useNativeDriver: false }).start(); }; render() { return ( Native: {this.props.children(this.state.native)} JavaScript: {this.props.children(this.state.js)} ); } } class ValueListenerExample extends React.Component { state = { anim: new Animated.Value(0), progress: 0, }; _current = 0; componentDidMount() { this.state.anim.addListener((e) => this.setState({ progress: e.value })); } componentWillUnmount() { this.state.anim.removeAllListeners(); } _onPress = () => { this._current = this._current ? 0 : 1; const config = { duration: 1000, toValue: this._current, }; Animated.timing(this.state.anim, { ...config, useNativeDriver: true }).start(); }; render() { return ( Value: {this.state.progress} ); } } const UIExplorerSettingSwitchRow = require('UIExplorerSettingSwitchRow'); class InternalSettings extends React.Component { _stallInterval: ?number; state: {busyTime: number | string, filteredStall: number}; render() { return ( { this._stallInterval = setInterval(() => { const start = Date.now(); console.warn('burn CPU'); while ((Date.now() - start) < 100) {} }, 300); }} onDisable={() => { clearInterval(this._stallInterval || 0); }} /> { require('JSEventLoopWatchdog').install({thresholdMS: 25}); this.setState({busyTime: ''}); require('JSEventLoopWatchdog').addHandler({ onStall: ({busyTime}) => this.setState((state) => ({ busyTime, filteredStall: (state.filteredStall || 0) * 0.97 + busyTime * 0.03, })), }); }} onDisable={() => { console.warn('Cannot disable yet....'); }} /> {this.state && JS Stall filtered: {Math.round(this.state.filteredStall)}, last: {this.state.busyTime} } ); } } class EventExample extends React.Component { state = { scrollX: new Animated.Value(0), }; render() { const opacity = this.state.scrollX.interpolate({ inputRange: [0, 200], outputRange: [1, 0], }); return ( Scroll me! ); } } const styles = StyleSheet.create({ row: { padding: 10, zIndex: 1, }, block: { width: 50, height: 50, backgroundColor: 'blue', }, }); exports.framework = 'React'; exports.title = 'Native Animated Example'; exports.description = 'Test out Native Animations'; exports.examples = [ { title: 'Multistage With Multiply and rotation', render: function() { return ( {anim => ( )} ); }, }, { title: 'Multistage With Multiply', render: function() { return ( {anim => ( )} ); }, }, { title: 'Scale interpolation with clamping', render: function() { return ( {anim => ( )} ); }, }, { title: 'Opacity without interpolation', render: function() { return ( {anim => ( )} ); }, }, { title: 'Rotate interpolation', render: function() { return ( {anim => ( )} ); }, }, { title: 'translateX => Animated.spring', render: function() { return ( {anim => ( )} ); }, },{ title: 'translateX => Animated.decay', render: function() { return ( {anim => ( )} ); }, },{ title: 'Drive custom property', render: function() { return ( {anim => ( )} ); }, }, { title: 'Animated value listener', render: function() { return ( ); }, }, { title: 'Animated events', render: function() { return ( ); }, }, { title: 'Internal Settings', render: function() { return ( ); }, }, ];