animation - 父边界内的可拖动 View

标签 animation react-native react-animated

我面临一项任务,我想在背景图像上放置一个可拖动的标记,然后在背景图像中获取标记的坐标。

我已关注 this使用 Animated.Image 制作可拖动标记的简洁教程, PanResponderAnimated.ValueXY .问题是我无法弄清楚如何限制可拖动 View 仅在其父级(背景图像)的边界内移动。

很感谢任何形式的帮助 :)

此致
延斯

最佳答案

这是使用 react-native-gesture-responder 的一种方法.

import React, { Component } from 'react'
import {
  StyleSheet,
  Animated,
  View,
} from 'react-native'
import { createResponder } from 'react-native-gesture-responder'

const styles = StyleSheet.create({
  container: {
    height: '100%',
    width: '100%',
  },
  draggable: {
    height: 50,
    width: 50,
  },
})

export default class WorldMap extends Component {
  constructor(props) {
    super(props)

    this.state = {
      x: new Animated.Value(0),
      y: new Animated.Value(0),
    }
  }
  componentWillMount() {
    this.Responder = createResponder({
      onStartShouldSetResponder: () => true,
      onStartShouldSetResponderCapture: () => true,
      onMoveShouldSetResponder: () => true,
      onMoveShouldSetResponderCapture: () => true,
      onResponderMove: (evt, gestureState) => {
        this.pan(gestureState)
      },
      onPanResponderTerminationRequest: () => true,
    })
  }
  pan = (gestureState) => {
    const { x, y } = this.state
    const maxX = 250
    const minX = 0
    const maxY = 250
    const minY = 0

    const xDiff = gestureState.moveX - gestureState.previousMoveX
    const yDiff = gestureState.moveY - gestureState.previousMoveY
    let newX = x._value + xDiff
    let newY = y._value + yDiff

    if (newX < minX) {
      newX = minX
    } else if (newX > maxX) {
      newX = maxX
    }

    if (newY < minY) {
      newY = minY
    } else if (newY > maxY) {
      newY = maxY
    }

    x.setValue(newX)
    y.setValue(newY)
  }
  render() {
    const {
      x, y,
    } = this.state
    const imageStyle = { left: x, top: y }

    return (
      <View
        style={styles.container}
      >
        <Animated.Image
          source={require('./img.png')}
          {...this.Responder}
          resizeMode={'contain'}
          style={[styles.draggable, imageStyle]}
        />
    </View>

    )
  }
}

关于animation - 父边界内的可拖动 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47291415/

相关文章:

javascript - 创建圆形鼠标悬停饱和效果

wpf - 当项目添加到列表框时动画 WPF 数据模板?

react-native - native 基础页脚接受玩家在 native react 中的触摸

reactjs - 如何动态设置高度为动画值后动画的组件的高度?

java - 代号一 - Form.registerAnimated() 有时不注册动画

ios - 向 popToRootViewController 添加自定义动画

javascript - 对不同文件进行 native 导航 react

react-native - 如何在 React Native 中将文本 float 到另一个文本上

javascript - React/React-Native 无法将 JSON 数据分配给状态变量

reactjs - react native : How to animate a particular component?