2015-05-10 25 views
25

İki Görünümüm var, A ve B Görünüm A'ya dokunarak bir 'dragAndDropStart' olayını tetikleme yeteneğine sahip olmak ve ardından A'dan B'ye sürükle ve bırak özelliğini etkinleştirmek istiyorum… örn., Görünüm A ve kullanıcının parmağı arasında görünen bir çizgi gösteriliyor). damla, ben başka bir 'dragAndDropEnd' olayı tetiklemek istiyorum B Görünümü bu sefer (sürükleme hareketini bırakmadan)React native'de nasıl sürükleyip bırakma eylemi oluşturabilirim?

enter image description here touchStart ve touchEnd işleyicileri çok onlar yayınım izin görünmüyor olarak sınırlıdır

bir bakıştan diğerine hareketi. Ayrıca, "sürükle" durumu arasında geçiş yapmazlar.

Yerleşik dokümanlar, hareket tanıtıcılarını kullanma konusunda biraz şifreli ve kullanımlarını gösteren hiçbir örnek görmedim.

Herhangi bir fikrin var mı?

+1

Bu yazı için özel olarak bu diyagram yaptıysanız bilmiyorum ama bu harika. –

+0

Teşekkürler Josh, diyagramlar koddan daha çok sevdiğim bir şey! –

+0

Etrafınızda olmak yararlı olur! –

cevap

15
export default class Viewport extends Component{ 
    constructor(props){ 
     super(props); 

     this.state = { 
      showDraggable : true, 
      dropZoneValues : null, 
      pan    : new Animated.ValueXY() 
     }; 

     this.panResponder = PanResponder.create({ 
      onStartShouldSetPanResponder :() => true, 
      onPanResponderMove    : Animated.event([null,{ 
       dx : this.state.pan.x, 
       dy : this.state.pan.y 
      }]), 
      onPanResponderRelease   : (e, gesture) => { 
       if(this.isDropZone(gesture)){ 
        this.setState({ 
         showDraggable : false 
        }); 
       }else{ 
        Animated.spring(
         this.state.pan, 
         {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){ 
     this.setState({ 
      dropZoneValues : event.nativeEvent.layout 
     }); 
    } 

    render(){ 
     return (
      <View style={styles.mainContainer}> 
       <View 
        onLayout={this.setDropZoneValues.bind(this)} 
        style={styles.dropZone}> 
        <Text style={styles.text}>Drop me here!</Text> 
       </View> 

       {this.renderDraggable()} 
      </View> 
     ); 
    } 

    renderDraggable(){ 
     if(this.state.showDraggable){ 
      return (
       <View style={styles.draggableContainer}> 
        <Animated.View 
         {...this.panResponder.panHandlers} 
         style={[this.state.pan.getLayout(), styles.circle]}> 
         <Text style={styles.text}>Drag me!</Text> 
        </Animated.View> 
       </View> 
      ); 
     } 
    } 
} 

-(void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer{ 
 

 
// your current View touch location suppose View A 
 
    CGPoint touchLocation = [panGestureRecognizer locationInView:self.contentView]; 
 

 
    CGRect movingAViewRect = CGRectMake(touchLocation.x, touchLocation.y, self.aView.width, self.aView.height); 
 

 
// NSLog(@"Point not Matched first => %@ and second => %@",NSStringFromCGPoint(touchLocation),NSStringFromCGPoint(self.bView.frame.origins)); 
 
    self.aView.center = touchLocation; 
 
     
 

 
    if(panGestureRecognizer.state == UIGestureRecognizerStateEnded) 
 
    { 
 
     //All fingers are lifted. 
 
     
 
    
 

 
     if(CGRectIntersectsRect(movingAViewRect,self.bView.frame)){ 
 
     
 
      NSLog(@"Point Matched first => %@ and second => %@",NSStringFromCGRect(movingAViewRect),NSStringFromCGRect (self.bView.frame)); 
 

 
     // and here you can perform some action for this 
 
      
 
      
 
     }else{ 
 
     
 
      NSLog(@"aView is not drag on bView please drag aView to bView "); 
 
      
 

 
     } 
 
     
 
     
 
     
 
     
 
    } 
 
} 
 
kaynak http://moduscreate.com/animated_drag_and_drop_with_react_native/

https://github.com/crysfel/DragAndDrop

+0

linkini de sağlayacağınızdan emin olun, bu çok umut verici görünüyor, kodumu kırmaya çalıştım. En son React Native sürümü, ancak bir kez daha test edebilirim, bu çözümü onaylayacağım, teşekkürler –

+0

Ok Bağlantınızdaki kodu doğruladım ve bu sürükle-bırak işlerini söylemekten mutluluk duyuyorum. teşekkürler –

+0

Herkesin ne anlama geldiğini açıklayabilir mi? 'geniş anlamda ne anlama geliyor? –

-4

Geçerli Görünüm Dikdörtgeni diğer görünüme görmelisiniz. Dikdörtgeninizden biri birbiriyle kesişiyorsa dikdörtgeni döndürür, sonra A görünümünün B'ye sürüklendiğini bildirirsiniz. olabilir size yardımcı olacaktır.

+2

React Native code ...... – Hasen

+0

evet, lütfen xcode projesinin örneğine ihtiyacınız varsa deneyin, ayrıca size –

İlgili konular