首页 > 其他分享 >React Native 动画(Animated)

React Native 动画(Animated)

时间:2023-09-28 15:12:41浏览次数:33  
标签:scale const deviceSize 1200 React Easing Animated Native

实现效果

代码

从react-native中引入

import {
    Animated,
    Easing,
} from 'react-native';

js实现

const opacity1 = useRef(new Animated.Value(0.2)).current;
const opacity2 = useRef(new Animated.Value(0.2)).current;
const scale1 = useRef(new Animated.Value(1)).current;
const scale2 = useRef(new Animated.Value(1)).current;

useEffect(() => {
    // 图标动画
    startAnimated();
}, [])

const startAnimated = () => {
    const opacityAni1 = Animated.sequence([
        Animated.timing( //随时间变化而执行动画
            opacity1, //动画中的变量值
            {
                toValue: 0.5, // 透明度最终变为0.5
                duration: 1200, //动画时长
                easing: Easing.linear,
                useNativeDriver: true,
            }
        ),
        Animated.timing(
            opacity1,
            {
                toValue: 0.2,
                duration: 1200,
                easing: Easing.linear,
                useNativeDriver: true,
            }
        ),
    ])
    const scaleAni1 = Animated.sequence([
        Animated.timing(
            scale1,
            {
                toValue: 1.02,
                duration: 1200,
                easing: Easing.linear,
                useNativeDriver: true,
            }
        ),
        Animated.timing(
            scale1,
            {
                toValue: 1,
                duration: 1200,
                easing: Easing.linear,
                useNativeDriver: true,
            }
        ),
    ])
    const opacityAni2 = Animated.sequence([
        Animated.timing(
            opacity2,
            {
                toValue: 0.5,
                duration: 1200,
                easing: Easing.linear,
                useNativeDriver: true,
            }
        ),
        Animated.timing(
            opacity2,
            {
                toValue: 0.2,
                duration: 1200,
                easing: Easing.linear,
                useNativeDriver: true,
            }
        ),
    ])
    const scaleAni2 = Animated.sequence([
        Animated.timing(
            scale2,
            {
                toValue: 1.02,
                duration: 1200,
                easing: Easing.linear,
                useNativeDriver: true,
            }
        ),
        Animated.timing(
            scale2,
            {
                toValue: 1,
                duration: 1200,
                easing: Easing.linear,
                useNativeDriver: true,
            }
        ),
    ])
    let animated = Animated.parallel([
        opacityAni1,
        scaleAni1,
        opacityAni2,
        scaleAni2,
    ])

    animated.start(() => startAnimated())
}

render中使用

<View style={styles.warnWrap}>
    <Animated.View style={{
        ...styles.avatarAnimation2,
        backgroundColor: 'rgb(245, 0, 0)',
        opacity: opacity2,
        transform: [{ scale: scale2 }],
    }} />
    <Animated.View style={{
        ...styles.avatarAnimation,
        backgroundColor: 'rgb(245, 0, 0)',
        opacity: opacity1,
        transform: [{ scale: scale1 }],
    }} />
    <View style={{
        ...styles.avatar,
        backgroundColor: 'rgb(245, 0, 0)',
    }}>
        <Image style={{ width: 22, height: 22 }} source={ImageResource.Common.Alarm} />
    </View>
</View>

css

const styles = StyleSheet.create({

    warnWrap: {
        position: 'absolute',
        bottom: 110,
        right: 3,
        zIndex: 9,
        width: deviceSize.scale(100),
        height: deviceSize.scale(100),
        justifyContent: 'center',
        alignItems: 'center',
    },
    avatar: {
        position: 'absolute',

        bottom: deviceSize.scale(15),
        left: deviceSize.scale(15),
        width: deviceSize.scale(70),
        height: deviceSize.scale(70),
        borderRadius: deviceSize.scale(70),
        justifyContent: 'center',
        alignItems: 'center',
    },
    avatarAnimation: {
        position: 'absolute',
        bottom: deviceSize.scale(8),
        left: deviceSize.scale(8),
        width: deviceSize.scale(83),
        height: deviceSize.scale(83),
        borderRadius: deviceSize.scale(83),
    },
    avatarAnimation2: {
        position: 'absolute',
        bottom: 0,
        left: 0,
        width: deviceSize.scale(100),
        height: deviceSize.scale(100),
        borderRadius: deviceSize.scale(100),
    },

})

标签:scale,const,deviceSize,1200,React,Easing,Animated,Native
From: https://www.cnblogs.com/ZerlinM/p/17735826.html

相关文章

  • React-Native之Gradle下载慢的解决方案
    一、解决gradle下载慢的问题1.使用国内镜像   maven脚本如下:buildscript{repositories{maven{url'https://maven.aliyun.com/repository/gradle-plugin'}maven{url'https://maven.aliyun.com/repository/google'}maven......
  • uniapp自动引入Vue3(ref,reactive...)的API、uniapp生命周期和封装hooks
    未自动导入Vue3(ref,reactive...)的API和uniapp生命周期,需要在每个页面把API和uniapp生命周期的代码都重复写一遍<scriptsetup>import{ref,reactive}from"vue"import{onLaunch,onShow,onHide}from'@dcloudio/uni-app'//封装的hooksimport{useLi......
  • react + react-router + less +antd 开发环境
    react+react-router+less+antd开发环境 react+react-router+less+antd开发环境搭建1.基于create-reacte-app,需要先安装这个脚手架,然后初始化项目。2.进入项目目录,首先npmruneject释放配置文件。3.安装各种包npminstallreact-routerreact-router-domle......
  • React表单合理取值方式
    React表单完全使用受控组件,即使用value和onChange来控制input状态<inputvalue={email}onChange={(e)=>setEmail(e.target.value)}/>在input输入字符时候,会频繁触发表单重新渲染,因为state改变,react进行了re-render要避免此种情况,可以使用非受控组件的表单,在组件之间没有......
  • React & TS 里面两个实用小技巧
    ❝在工作中我们会经常使用技巧和黑魔法,本篇主要讲两个,希望能帮助到大家!文章内容看情况而定,不一定是React里面专属的!❞TS动态取数据这里其实也不知道起什么标题,具体还是看内容吧。平常做法(JS)在JS中,我经常使用对象去定义数据,然后去获取它,像下面这样//订单状态//只是举个栗子不......
  • React:我们的用法习惯可能是错误的(不优雅)
    React:我们的用法习惯可能是错误的(不优雅)今天学到了2023-01-088,361阅读4分钟 在我们React的日常开发中一些常用的写法,看似运行的很好,实际可能并不优雅。学习React并不是如何如何使用它,而是如何写出优雅,干净的代码。下面举一些例子,总结了一些React开发中不好的写法及相......
  • immerjs:React开发必会技能
    immerjs:React开发必会技能龙骑士尹道长 ​关注 2人赞同了该文章我们都知道React追求的泛式是数据不可变,一般情况下state或者props改变才进入render阶段;如果我们创建的state是一个一般数据类型,他就是一个不可变的值,如果需要改变我们需要重新创建一个state......
  • React Hooks中父组件中调用子组件方法
    import {useState,useImperativeHandle,forwardRef}from 'react';//props子组件中需要接受reflet ChildComp=(props,ref)=>{    //此处注意useImperativeHandle方法的的第一个参数是目标元素的ref引用    useImperativeHandle(ref,()=>({      ......
  • 竟然可以在一个项目中混用 Vue 和 React?
    React和Vue是前端开发中的两大热门框架,各自都有着强大的功能和丰富的生态系统。然而,你有没有想过,在一个项目中同时使用React和Vue?是的,你没有听错,可以在同一个项目中混用这两个框架!本文就来分享3个用于混合使用React和Vue的工具!#VeauryVeaury是一个基于React和Vue3的工......
  • 浅谈云原生Cloud Native
    目录1.云原生是什么2.云原生与传统软件有什么区别3.云原生有哪些代表性的技术1.云原生是什么云原生(CloudNative)是一种构建和运行应用程序的方法,可以充分利用云计算模型的优势。云原生是一种面向服务的架构(SOA),可以在公有云、私有云和混合云等各种环境中运行。云原生的核心技术......