栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在React Native中使用多视图进行拖放?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在React Native中使用多视图进行拖放?

有几个地方需要修改以使其起作用。

Step by Step:

  1. 您的四个圈子拥有自己的位置。因此Animated.ValueXY需要4 。
        this.dataDrag = [1,2,3,4];    this.pan = this.dataDrag.map( () => new Animated.ValueXY() );
  1. PanResponder
    需要当前索引中的信息。将其拉出作为返回包含info信息的函数的函数index。
        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();     } }        });        }
  1. 根据上述变化制作样式。删除不必要的外部视图以及阻塞事件。
        {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>    ))}
  1. 做保证金技巧以减少头寸的计算。更改
    top / left为marginTop / marginLeft
        draggableContainer: {        position    : 'absolute',        marginTop   : Window.height/2 - CIRCLE_RADIUS,        marginLeft  : Window.width/2 - CIRCLE_RADIUS,    },

Final Code:

import React, { Component } from 'react';import {    StyleSheet,    View,    Text,    PanResponder,    Animated,    Easing,    Dimensions,    Platform,    TouchableOpacity,} from 'react-native';let CIRCLE_RADIUS = 36;let Window = Dimensions.get('window');export 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,        };    }    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){        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.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    },});


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/636461.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号