I have created ScrollView
with three views. and I want to bind the dragged view inside the ScrollView
, and the rest of haven't drag-dropped view should maintain outside of ScrollView
. How can it be possible.
See the GIF : I want to add the draggableView inside the ScrollView.
Code :
import React, { Component } from 'react'; import { StyleSheet, View, Text, PanResponder, Animated, Easing, Dimensions, Platform, TouchableOpacity, ScrollView, } from 'react-native'; import Carousel from 'react-native-snap-carousel'; let CIRCLE_RADIUS = 36; let Window = Dimensions.get('window'); const instructions = Platform.select({ ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu', android: 'Double tap R on your keyboard to reload,\n' + 'Shake or press menu button for dev menu', }); export default class App extends Component<{}> { constructor(props){ super(props); this.dataDrag = [1,2,3,4], this.pan = this.dataDrag.map( () => new Animated.ValueXY() ); this.state = { showDraggable : true, dropZoneValues : null, entries : ['Apple1' , 'Apple2', 'Apple3'] }; } getPanResponder(index) { return PanResponder.create({ onStartShouldSetPanResponder: () => true, onPanResponderMove : Animated.event([null,{ dx : this.pan[index].x, dy : this.pan[index].y }]), onPanResponderRelease : (e, gesture) => { if(this.isDropZone(gesture)){ this.setState({ showDraggable : false }); }else{ Animated.spring( this.pan[index], {toValue:{x:0,y:0}} ).start(); } } }); } isDropZone(gesture){ var dz = this.state.dropZoneValues; return gesture.moveY > dz.y && gesture.moveY < dz.y + dz.height; } setDropZoneValues(event){ console.log('event.nativeEvent.layout', event.nativeEvent.layout); this.setState({ dropZoneValues : event.nativeEvent.layout }); } _renderItem ({item, index}) { return ( <View style={{width: Dimensions.get('window').width - 100 , height : 150 , backgroundColor : 'red' , marginLeft : 50 , marginRight : 50}}> <Text style={{color : 'black' , marginTop : 20}}>{item}</Text> </View> ); } render(){ return ( <View style={styles.mainContainer}> <ScrollView> <View onLayout={this.setDropZoneValues.bind(this)} style={[styles.dropZone , {marginTop : 10}]}> </View> <View onLayout={this.setDropZoneValues.bind(this)} style={[styles.dropZone , {marginTop : 10}]}> </View> <View onLayout={this.setDropZoneValues.bind(this)} style={[styles.dropZone , {marginTop : 10}]}> </View> </ScrollView> {this.dataDrag.map((d, index) => ( <Animated.View key={index} {...this.getPanResponder(index).panHandlers} style={[styles.draggableContainer, this.pan[index].getLayout(), styles.circle]}> <Text style={styles.text}>Drag {index}</Text> </Animated.View> ))} </View> ); } } let styles = StyleSheet.create({ mainContainer: { flex : 1 }, dropZone : { height : 100, backgroundColor:'#2c3e50' }, text : { marginTop : 25, marginLeft : 5, marginRight : 5, textAlign : 'center', color : '#fff' }, draggableContainer: { position : 'absolute', marginTop : Window.height/2 - CIRCLE_RADIUS, marginLeft : Window.width/2 - CIRCLE_RADIUS, }, circle : { backgroundColor : '#1abc9c', width : CIRCLE_RADIUS*2, height : CIRCLE_RADIUS*2, borderRadius : CIRCLE_RADIUS }, });