动画移动x和y与软移动反应原生

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动画移动x和y与软移动反应原生相关的知识,希望对你有一定的参考价值。

我想在x和y轴上移动一个球,但是动画不是柔软的,运动是颤抖的,如果我移动得更快,它不会在对角线上精确移动,而是做一个角度我怎么能用软移动球?这是例子:

https://snack.expo.io/HJvm5WI5N

代码是:

import React from 'react';
import {Animated, StyleSheet, Text, TouchableOpacity, View} from 'react-native';

export default class App extends React.Component {

    constructor(props) {
        super(props)

        this.ball = new Animated.ValueXY({x: 30, y: 30})
    }

    moveBall = () => {
        Animated.timing(this.ball, {
            toValue: {x: 250, y: 350},
            duration: 2000
        }).start()
    }

    render() {
        return (
            <View style={styles.container}>
                <TouchableOpacity onPress={this.moveBall}>
                    <Animated.View style={[styles.ball, this.ball.getLayout()]}>
                        <Text style={styles.text}>+</Text>
                    </Animated.View>
                </TouchableOpacity>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#fff',
    },
    ball: {
        width: 60,
        height: 60,
        borderRadius: 30,
        backgroundColor: 'red',
        alignItems: 'center',
        justifyContent: 'center',
    },
    text: {
        fontWeight: 'bold',
        color: 'white',
        fontSize: 32
    }
});

答案

您可以使用useNativeDriver来获得更好的性能。与translateX和translateY一起使用。因为你不能使用带有左右属性的useNativeDriver

constructor(props) {
        super(props)

        this.ball = new Animated.Value(0)
    }

    moveBall = () => {
        Animated.timing(this.ball, {
            toValue: 1,
            duration: 1000,
            useNativeDriver: true
        }).start()
    }


  render() {
    const xVal = this.ball.interpolate({
        inputRange: [0, 1],
            outputRange: [0, 250]
    });

    const yVal = this.ball.interpolate({
        inputRange: [0, 1],
            outputRange: [0, 350]
    })

    const animStyle = {
      transform: [{
        translateY: yVal, translateX: xVal
      }]
    }
    return (
      <View style={styles.container}>
                <TouchableOpacity onPress={this.moveBall}>
                    <Animated.View style={[styles.ball, animStyle]}>
                        <Text style={styles.text}>+</Text>
                    </Animated.View>
                </TouchableOpacity>
            </View>
    );
  }

以上是关于动画移动x和y与软移动反应原生的主要内容,如果未能解决你的问题,请参考以下文章

D3.js 沿 x,y 坐标为圆设置动画

离子/ cordova与2020年原生反应

反应原生导航在屏幕之间移动

为移动目标 lat/lng 和缩放级别的动画偏移地图片段的中心

canvas做动画

Android开发 动画之translate(位移动画)