react-native使用动画Animated

2024-01-09

官方网文档: 动画Animated
一些精彩的例子: React Native 动画(Animated)
渐变组件的使用: ReactNative 进阶(四十五):渐变组件 react-native-linear-gradient

需要实现如下的动画动画效果:

shinebutton

进行拆分:

  • 亮光从左到右位置的移动 ==〉可以用marginLeft的值改变来展示 ==〉使用react-native的Animated方法
  • 当亮光移动到按钮的最右边的时候,透明度应该为0
  • 亮光是一个倾斜状的渐变白色块状 ===〉使用react-native-linear-gradient组件,包含对颜色的透明度

react-native的Animated方法:

  const animatedValue = React.useRef(new Animated.Value(0)).current; // 创建value
  const marginLeft = animatedValue.interpolate({
    inputRange: [0, 1], // 当animatedValue的值从0变化到1的时候
    outputRange: [0, 300], // marginLeft则从0变化到300
  });
    // opacity will be 0 if the shine view removed right
  const opacity = animatedValue.interpolate({
    inputRange: [0, 1],
    outputRange: [1, 0], // 透明度变化
    extrapolate: 'clamp',
  });
  const rotateAnimated = Animated.timing(animatedValue, { // 必有,时间序列变化函数
    toValue: 1, // 最终值
    duration: 500, // 动画的持续时间(毫秒)
    easing: Easing.in, // 缓动函数
  });
  rotateAnimated.start(); // 开始执行动画
  • interpolate函数,可以将动画值从一个范围映射到另一个范围。

react-native-linear-gradient组件:

<LinearGradient
 start={{ x: 0, y: 0.2 }}
 end={{ x: 0.8, y: 1 }}
 colors={['rgba(255, 255, 255, 0)', 'rgba(255, 255, 255, 0.5)', 'rgba(255, 255, 255, 0)']}
 style={[styles.shadowView, { width: height }]}
/>
  • 可以进行透明度。

完整代码:

import React, { memo, useEffect } from 'react';
import {
  Animated,
  Easing,
  StyleSheet,
  Text,
  TextStyle,
  TouchableWithoutFeedback,
  View,
  ViewStyle,
} from 'react-native';
import LinearGradient from 'react-native-linear-gradient';

export interface ShineButtonProps {
  buttonText: string;
  buttonTextStyle?: TextStyle;
  buttonViewStyle: ViewStyle & { width: number; height: number }; // width and height are required
  onPress: () => void;
}

const ShineButton = ({
  buttonText,
  buttonTextStyle,
  buttonViewStyle,
  onPress,
}: ShineButtonProps) => {
  const { width, height } = buttonViewStyle;

  const animatedValue = React.useRef(new Animated.Value(0)).current;
  const marginLeft = animatedValue.interpolate({ // 映射函数
    inputRange: [0, 1],
    outputRange: [0, width],
  });
  // opacity will be 0 if the shine view removed right
  const opacity = animatedValue.interpolate({
    inputRange: [0, 1],
    outputRange: [1, 0],
    extrapolate: 'clamp',
  });
  const rotateAnimated = Animated.timing(animatedValue, { // 必有,时间变化函数
    toValue: 1,
    duration: 500,
    easing: Easing.in,
  });

  useEffect(() => {
    rotateAnimated.start(); // 开始执行动画
  });

  return (
    <View style={styles.viewContainer}>
      <TouchableWithoutFeedback
        style={styles.buttonContainer}
        onPress={onPress}
      >
        <View style={[styles.buttonView, buttonViewStyle]}>
          <Text style={[styles.buttonText, buttonTextStyle]}>{buttonText}</Text>
        </View>
      </TouchableWithoutFeedback>
      <Animated.View
        style={[
          styles.animatedContainer,
          {
            marginLeft, // 使用
            width: height,
            height,
            opacity,
          },
        ]}
      >
        <LinearGradient
          start={{ x: 0, y: 0.2 }}
          end={{ x: 0.8, y: 1 }}
          colors={['rgba(255, 255, 255, 0)', 'rgba(255, 255, 255, 0.5)', 'rgba(255, 255, 255, 0)']}
          style={[styles.shadowView, { width: height }]}
        />
      </Animated.View>
    </View>
  );
};

export default memo(ShineButton);

const styles = StyleSheet.create({
  viewContainer: {
    flex: 1,
    position: 'relative',
  },
  buttonContainer: {
    zIndex: 2,
  },
  animatedContainer: {
    position: 'absolute',
    top: 0,
    left: 0,
    right: 0,
    bottom: 0,
    zIndex: 1,
  },
  shadowView: {
    position: 'absolute',
    top: 0,
    bottom: 0,
  },
  buttonView: {
    backgroundColor: Colors.white,
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
  },
  buttonText: {
    color: Colors.primary,
    ...TypographyFontPreset.R14,
    fontWeight: '900',
  },
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react-native使用动画Animated 的相关文章

随机推荐

  • 奇异值分解

    https blog csdn net Jayphone17 article details 113106887 降维与压缩 奇异值分解 SVD 奇异值分解 Singular Value Decomposition SVD 可以用于降维 特
  • 网络空间安全女生就业,怎么学?

    我实验室的学长们基本都是以红队和复现为主 如果学校好点可能还有更多的选择 如果想在这个方向深入下去 推荐流程是先打两年CTF 把大概的技术方向摸一摸 大一的话 如果学校还不错 那就优先建议打好基础 包括C语言 Python一类 建议把CTF
  • 解决“DataFrame object has no attribute append“问题

    1 将append改为了 append 这个成功了 dataframe dataframe append 2 可以使用 pandas concat 方法代替 dataframe append 这个我没试验成功 出现这个报错 TypeErro
  • OPT 大华SDK

    OPT 大华SDK
  • Linux 系统日志及其归档

    主要记录Linux 系统需要关注的日志文件 以及日志归档服务 rsyslogd 系统日志服务 rsyslogd 日志服务 rsyslogd reliable and extended syslogd 可靠 可扩展的系统日志服务 Rsyslo
  • 金属的相是什么

    问题描述 金属的相是什么 问题解答 在金属学和材料科学中 相 通常指的是材料中具有相同化学组成和结构的区域 金属的相通常是晶体结构的一部分 其中原子或离子按照一定的方式排列 以下是金属的两个主要相 晶粒相 金属通常以晶体的形式存在 其中原子
  • 内网穿透的应用-使用Net2FTP轻松部署本地Web网站并公网访问管理内网资源

    文章目录 1 前言 2 Net2FTP网站搭建 2 1 Net2FTP下载和安装 2 2 Net2FTP网页测试 3 cpolar内网穿透 3 1 Cpolar云端设置 3 2 Cpolar本地设置
  • 超多免费代码资源及教程下载-matlab和python

    引言 在这个领域 有一个理论 没有免费午餐 No Free Lunch NFL 理论 它从逻辑上证明了不存在最适合解决所有优化问题的元启发式算法 换句话说 特定的元启发式可能在一组问题上显示出非常有希望的结果 但相同的算法可能在另一组问题上
  • API接口:技术、应用与实践

    随着数字化时代的到来 API接口在软件开发和数据交互中扮演着越来越重要的角色 本文深入探讨了API接口的基本概念 技术原理 设计方法 最佳实践以及在各行业的应用案例 关键词 API接口 软件开发 数据交互 技术原理 设计方法 一 引言 随着
  • 2020年认证杯SPSSPRO杯数学建模C题(第二阶段)抗击疫情,我们能做什么全过程文档及程序

    2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情 我们能做什么 原题再现 2020 年 3 月 12 日 世界卫生组织 WHO 宣布 席卷全球的冠状病毒引发的病毒性肺炎 COVID 19 是一种大流行病 世卫组织上一次宣布大流行是在
  • 【技术科普】什么是达芬奇架构?有什么优势?

    芯片架构是指芯片设计的基本结构和组织方式 用于实现各种计算 存储和通信功能 芯片架构通常包括处理器核心 内存 输入输出接口等组成部分 这些部分的设计对芯片性能和功耗有着直接的影响 世界上主流的芯片架构主要包括x86 ARM PowerPC和
  • 2020年认证杯SPSSPRO杯数学建模D题(第二阶段)让电脑桌面飞起来全过程文档及程序

    2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现 对于一些必须每天使用电脑工作的白领来说 电脑桌面有着非常特殊的意义 通常一些频繁使用或者比较重要的图标会一直保留在桌面上 但是随着时间的推移 桌面上的图标会越来越多
  • JNPF——面向研发使用、全栈开发、前后端分离的低代码平台

    1 背景 JNPF是一个快速开发应用的平台 一款 面向研发开发使用 全栈开发 前后端分离 的低代码工具 拥有强大的 可视化建模 数据库和API集成能力 目前已有将 超千家企业 将JNPF低代码开发工具融入内部研发体系 相较于传统的产研开发
  • CTF之逆向入门

    逆向工程 Reverse Engineering 又称反向工程 是一种技术过程 即对一项目标产品进行逆向分析及研究 从而演绎并得出该产品的处理流程 组织结构 功能性能规格等设计要素 以制作出功能相近 但又不完全一样的产品 逆向工程源于商业及
  • 【Threejs】代码+图文带你快速上手

    前言 大家好 我是南木元元 热衷分享有趣实用的文章 希望大家多多支持 一起进步 个人主页 南木元元
  • Python小说阅读器制作教程

    目录 一 准备阶段 二 创建项目文件夹 三 创建Python文件 四 编写代码 五 运行程序 六 完善功能 可选 七 高级功能 总结 Python是一门强大的编程语言 它被广泛用于各种应用开发 包括小说阅读器的制作 下面我们将一步步教你如何
  • 爬虫数据特殊符号处理(记录+持续补充)

    1 xa0 replace u xa0 2 amp html 的空格 https blog csdn net weixin 43640594 article details 122859029 import html html unesca
  • 一个寒假能学会黑客技术吗?看完你就知道了

    一个寒假能成为黑客吗 资深白帽子来告诉你 如果你想的是学完去美国五角大楼内网随意溜达几圈 想顺走一点机密文件的话 劝你还是趁早放弃 但是成为一名初级黑客还是绰绰有余的 你只需要掌握好渗透测试 Web安全 数据库 搞懂web安全防护 SQL注
  • 新能源预测数据集GEFCom Data,用于光伏发电、风电功率、负荷、电价预测

    引言 新能源在满足世界能源需求方面日益重要 其特点是 发电量在很大程度上取决于天气状况 为了有效地将其整合到电网中 对新能源发电量进行准确的预测是一项不可避免的要求 新能源准确预测成为一项有趣且新颖的挑战 虽然已有大量文献对新能源预测进行了
  • react-native使用动画Animated

    官方网文档 动画 Animated 一些精彩的例子 React Native 动画 Animated 渐变组件的使用 ReactNative 进阶 四十五 渐变组件 react native linear gradient 需要实现如下的动