style react icon helmet javascript react-native

javascript - icon - react native button style



React Native: anima el encabezado de contracción con pestañas (2)

Puede lograr esto controlando las acciones de desplazamiento animadas usted mismo usando el componente RN-Animated . Esto no es exactamente lo que pediste, pero se puede jugar fácilmente para obtener los resultados correctos y realmente solo necesitas usar el método renderScrollComponent de cualquier vista de lista para capturar lo mismo ... así que ... Aquí hay un código :

El código

constructor(props) { super(props); this.headerHeight = 150; this.state = { scrollY: new Animated.Value(0), }; } render() { return ( <View style={[ styles.container, { width: this.props.display.width, height: this.props.display.height, } ]}> { this.renderScrollView() } { this.renderListHeader() } </View> ); } renderListHeader() { return ( <Animated.View style={[ styles.headerContainer, { width: this.props.display.width, height: this.state.scrollY.interpolate({ inputRange: [0, this.headerHeight], outputRange: [this.headerHeight, this.headerHeight / 2], extrapolate: ''clamp'', }), } ]}> <Text style={[bodyFontStyle, styles.testingText]}> I am a test! </Text> </Animated.View> ); } renderScrollView() { return ( <Animated.ScrollView bounces={false} scrollEventThrottle={1} showsVerticalScrollIndicator={false} showsHorizontalScrollIndicator={false} onScroll={Animated.event( [{ nativeEvent: { contentOffset: { y: this.state.scrollY } } }] )}> <Animated.View style={[ styles.innerScrollContainer, { height: 800, width: this.props.display.width, marginTop: this.headerHeight, } ]}> <Text style={[bodyFontStyle, styles.innerContainerText]}> Look ma! No Hands! </Text> </Animated.View> </Animated.ScrollView> ); } const styles = StyleSheet.create({ container: { position: ''relative'', backgroundColor: ''transparent'', }, headerContainer: { position: ''absolute'', top: 0, left: 0, overflow: ''hidden'', backgroundColor: ''green'', }, innerScrollContainer: { position: ''relative'', backgroundColor: ''white'', }, innerContainerText: { color: ''black'' }, testingText: { color: ''black'' }, });

Estoy seguro de que entiendes lo que este código intenta hacer ... pero solo en caso de que haya un colapso.

Desglose de código

Utilizo los apoyos this.props.display.width / height para enviar el ancho / alto del nivel del sistema del ancho / alto de la pantalla actual del dispositivo, pero si prefieres el uso flexible, en su lugar.

No necesita necesariamente un tamaño de encabezado estático o codificado, solo un lugar central (es decir, nivel de clase o nivel de módulo JS) para usarlo en su código de clase.

Por último, solo porque haya interpolado los datos de desplazamiento a la altura del cuadro, no significa que deba hacerlo. En el ejemplo que muestra, parece más como si quisiera traducir la caja hacia arriba en lugar de reducir su altura.

Gol

Im tratando de crear una vista con un encabezado animado que se encoge con una pestaña que contiene pestañas con contenido desplazable. Ver imagen.

Preparar

Estoy usando reaccionar-navegación con un TabNavigator. El encabezado es un componente con una altura fija, actualmente arriba del TabNavigator. El encabezado se fija por encima de las pestañas todo el tiempo teniendo un espacio precioso.

Enfoques probados

  • He intentado con Janic Duplessis Blog Post, pero no puedo hacerlo funcionar debido a las pestañas.

  • También traté de implementarlo con dos ScrollView / FlatList: uno envuelto alrededor de toda la vista y otro envolviendo el contenido, pero no puedo reaccionar como nativo para propagar el borde de desplazamiento.

El efecto deseado es el mismo que en la tienda de Google Play.


Me las arreglé para implementar esto con Animated.diffClamp - aquí puedes ver el código.

* Estoy usando el paquete nativo-base para los componentes UI (para simplificar el código UI), pero las interpolaciones / definiciones de animación son las mismas con o sin él.