Flutter Animation 动画

Flutter 中的 Animations(一),Android经典面试 以前一直是自己在网上东平西凑的找,找到的东西也是零零散散,很多时候都是看着看着就没了,时间浪费了,问题却还没得到解决,很让人抓狂。后面我就自己整理了一套资料,还别说,真香!资料有条理,有系统,还很全面,我不方便直接放出来,大家可以先看看有没有用得到的地方吧。[外链图片转存中…(img-oihHRu6j-1711644285777)][外链图片转存中…(img-TqMahanf-1711644285778)][外链图片转存中…(img-jloJmcgJ-1711644285778)] 阅读详情

前言 :

在Flutter 中,做动画离不开这么一个类,那就是

Animation

这个类如往常一样,也是一个抽象类。

abstract class Animation<T> extends Listenable implements ValueListenable<T>

整个animation.dart 文件只有两百多行代码,其中包含了大量的注释。

这句话应该就可以看出Tween 的重要性了。

一 Animation 

了解一下这个类中的方法吧。

1 addListener

每当动画的值改变的时候,动画就会通知所有通过addListener 添加的监听器

2 addStatusListener

简而言之,就是动画的状态发生改变的时候,会通知所有通过addStatusListener 添加的监听器 。

  • 当动画的状态发生变化时,会通知所有通过 addStatusListener 添加的监听器。

  • 通常情况下,动画会从 dismissed 状态开始,表示它处于变化区间的开始点。

  • 举例来说,从 0.0 到 1.0 的动画在 dismissed 状态时的值应该是 0.0。

  • 动画进行的下一状态可能是 forward(比如从 0.0 到 1.0)或者 reverse(比如从 1.0 到 0.0)。

  • 最终,如果动画到达其区间的结束点(比如 1.0),则动画会变成 completed 状态。

3 removeListener

4 removeStatusListener

二  AnimationController

AnimationController 这个是继承Anamation的,里面有几个属性比较重要


值得注意的是 vsync 参数是必传的,Flutter的渲染闭环,每次渲染一帧画面之前都需要一个vsync信号,所以需要将SingleTickerProviderStateMixin 混入到State 类中才能初始化AnimationController

  AnimationController({
    double? value,
    this.duration,
    this.reverseDuration,
    this.debugLabel,
    this.lowerBound = 0.0,
    this.upperBound = 1.0,
    this.animationBehavior = AnimationBehavior.normal,
    required TickerProvider vsync,
  }) : assert(lowerBound != null),
       assert(upperBound != null),
       assert(upperBound >= lowerBound),
       assert(vsync != null),
       _direction = _AnimationDirection.forward {
    _ticker = vsync.createTicker(_tick);
    _internalSetValue(value ?? lowerBound);
  }

三  CurvedAnimation

这个类可以将AnimationController 和 Curve 结合起来,生成一个新的Animation 对象,有什么用呢?这个地方可以设置动画的速率。

它也是继承与Animation 

  CurvedAnimation({
    required this.parent,
    required this.curve,
    this.reverseCurve,
  }) : assert(parent != null),
       assert(curve != null) {
    _updateCurveDirection(parent.status);
    parent.addStatusListener(_updateCurveDirection);
  }

这个Curve 类型的对象有一些常量,可以直接调用

四 Tween

Tween 动画,又称为补间动画,有两个关键参数,begin 和 end

这玩意有什么用呢?

它主要是弥补 AnimationController 动画值只能为 double 类型的不足,,所以需要不同类型的变化值,那么就可以使用 Tween 。

类型多种多样

ColorTween  ,TextStyleTween,DecorationTween

 _colorAnimation =
        ColorTween(begin: primaryColor[100], end: primaryColor[900])
            .animate(_animationController!)
          ..addListener(() {
            setState(() {});
          })
          ..addStatusListener((status) {
            if (status == AnimationStatus.completed) {
              _animationController!.reverse();
            } else if (status == AnimationStatus.dismissed) {
              _animationController!.forward();
            }
          });
 //字体样式动画
    _textStyleAnimation = TextStyleTween(
            begin: TextStyle(color: Colors.orange, fontSize: 15),
            end: TextStyle(color: Colors.redAccent, fontSize: 30))
        .animate(_animationController!)
      ..addListener(() {
        setState(() {});
      });
  _sizeAnimation =
        Tween(begin: Size(50, 50), end: Size(200, 200)).animate(_controller!)
          ..addListener(() {
            setState(() {});
          })
          ..addStatusListener((status) {
            if (status == AnimationStatus.completed) {
              _controller!.reverse();
            }
          });


  _demo2() {
    return Container(
      width: _sizeAnimation!.value.width,
      height: _sizeAnimation!.value.height,
      color: Colors.blueAccent,
    );
  }

五  使用

上面把该介绍的都介绍了,那么如何使用呢 ?

就是如下方式使用

import 'package:flutter/material.dart';

class StudyAnimationPage extends StatefulWidget {
  const StudyAnimationPage({super.key});

  @override
  State<StudyAnimationPage> createState() => _StudyAnimationPageState();
}

class _StudyAnimationPageState extends State<StudyAnimationPage>
    with SingleTickerProviderStateMixin {
  // 控制器
  AnimationController? _controller;
  CurvedAnimation? _curvedAnimation;
  // 动画
  Animation? _colorAnimation;
  // size 动画
  Animation<Size>? _sizeAnimation;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // 这个this 必须在方法里面写才不报错
    //1  初始化控制器
    _controller =
        AnimationController(vsync: this, duration: Duration(seconds: 2));
    // 2 这里可以设置执行动画的速率
    _curvedAnimation =
        CurvedAnimation(parent: _controller!, curve: Curves.easeInOutCirc);

    // 3 动画
    _colorAnimation =
        ColorTween(begin: Colors.redAccent, end: Colors.blueAccent)
            .animate(_controller!)
          ..addListener(() {
            setState(() {});
          })
          ..addStatusListener((status) {
            if (status == AnimationStatus.completed) {
              _controller!.reverse();
            }
          });
    _sizeAnimation =
        Tween(begin: Size(50, 50), end: Size(200, 200)).animate(_controller!)
          ..addListener(() {
            setState(() {});
          })
          ..addStatusListener((status) {
            if (status == AnimationStatus.completed) {
              _controller!.reverse();
            }
          });
  }

  @override
  Widget build(BuildContext context) {
    print("build方法被调用了哈哈哈");
    return Scaffold(
      appBar: AppBar(
        title: Text("data"),
      ),
      body: Container(
        width: double.infinity,
        height: double.infinity,
        child: Column(
          children: [_demo1(), _demo2()],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _controller!.forward();
        },
        child: Icon(Icons.open_in_browser),
      ),
    );
  }

  _demo1() {
    return Container(
      color: _colorAnimation!.value,
      width: 100,
      height: 100,
    );
  }

  _demo2() {
    return Container(
      width: _sizeAnimation!.value.width,
      height: _sizeAnimation!.value.height,
      color: Colors.blueAccent,
    );
  }
}

以上的代码还有一个问题,因为监听动画的值不停的改变,那么setState就会不停的执行,略显繁重,所以就可以 使用AnimatedWidget

六  AnimatedWidget

创建一个Widget 继承与AnimatedWidget ,然后Widget 的build 就不会随着动画值的改变一直执行,而是执行我们自己创建的Widget 中的build

class MyAnimatedBox extends AnimatedWidget {
  // 这里传递 一个animation 过来 传递给父类
  MyAnimatedBox(Animation anim) : super(listenable: anim);

  @override
  Widget build(BuildContext context) {
    Animation sizeAnimation = listenable as Animation;
    // TODO: implement build
    return Container(
      width: sizeAnimation.value.width,
      height: sizeAnimation.value.height,
      color: Colors.blueAccent,
    );
  }
}

调用

_demo2() {

return MyAnimatedBox(_sizeAnimation!);

}

当然还有一些问题:

1 每一次使用都要创建一个类,这有点麻烦

2 如果我们构建的Widget 有子类,那么子类依然会重复的build

so 怎么解决呢 ??

七  AnimatedBuilder

1  不用显式的去添加帧监听器,然后再调用setState() 了,这个好处和AnimatedWidget是一样的。

2 更好的性能:因为动画每一帧需要构建的 widget 的范围缩小了,如果没有builder,setState()将会在父组件上下文中调用,这将会导致父组件的build方法重新调用;而有了builder之后,只会导致动画widget自身的build重新调用,避免不必要的rebuild。

  _demo3() {
    return AnimatedBuilder(
      animation: _sizeAnimation!,
      // child: child,
      builder: (BuildContext context, Widget? child) {
        return Container(
          width: _sizeAnimation!.value.width,
          height: _sizeAnimation!.value.height,
          color: Colors.blueAccent,
        );
      },
    );
  }

八  交织动画

什么事交织动画,顾名思义,就是多个动画交织在一起。通过多个Tween 生成多个Animation 对象。

// 动画

Animation? _colorAnimation;

// size 动画

Animation<Size>? _sizeAnimation;

// 透明度动画

Animation<double>? _opacityAnimation;

// 旋转动画

Animation<double>? _rotationAnim;

// 3 动画

_colorAnimation =

ColorTween(begin: Colors.redAccent, end: Colors.blueAccent)

.animate(_controller!)

..addListener(() {

setState(() {});

});

// ..addStatusListener((status) {

// if (status == AnimationStatus.completed) {

// _controller!.reverse();

// }

// });

_sizeAnimation =

Tween(begin: Size(50, 50), end: Size(200, 200)).animate(_controller!);

_opacityAnimation = Tween(begin: 0.3, end: 1.0).animate(_controller!);

_rotationAnim = Tween(begin: 0.0, end: 2 * pi).animate(_controller!);

  /**
   * 多个动画交织在一起
   * 1 大小变化的动画
   * 2 颜色变化的动画
   * 3 透明度变化的动画
   * 4 旋转的动画
   * 
  */
  _demo4() {
    return Opacity(
      opacity: _opacityAnimation!.value,
      child: Transform(
        alignment: Alignment.center,
        transform: Matrix4.rotationZ(_rotationAnim!.value),
        child: Container(
          color: _colorAnimation!.value,
          width: _sizeAnimation!.value.width,
          height: _sizeAnimation!.value.height,
        ),
      ),
    );
  }

Windows 11 部署 Docker Desktop:从 WSL 报错到服务配置的完整排障实录 本文详细记录了在Windows 11上部署Docker Desktop时遇到的WSL报错问题及完整解决方案。从Hyper-V配置、BIOS设置到系统服务检查,提供了一系列实用命令和排查步骤,帮助开发者快速解决'Unexpecter WSL error'等常见问题,实现Docker与WSL2的稳定运行。 阅读详情

相关推荐

手把手教你用ET-BERT预训练模型搞定加密流量分类(附完整代码)

本文详细介绍了如何使用ET-BERT预训练模型实现加密流量分类,包括环境配置、数据预处理、模型微调及优化策略。通过实战代码示例,帮助开发者快速掌握这一技术,提升网络安全领域的加密流量分析能力。

weixin_29166013的博客 493

Flutter动画Animation开发指南

动画Animation开发指南 在Flutter中有哪些类型的动画? 如何使用动画库中的基础类给widget添加动画? 如何为动画添加监听器? 该什么时候使用AnimatedWidget与AnimatedBuilder? 如何使用Hero动画? 精心设计的动画会让用户界面感觉更直观、流畅,能改善用户体验。 Flutter的动画支持可以轻松实现各种动画类型。许多widget,特别是Material Design widgets, 都带有在其设计规范中定义的标准动画效果,但也可以自定义这些效果。 在

你的益达啊 3143

U24时钟信号上升下降沿出现非单调性--简单分析

交换机U24时钟信号上升下降沿出现非单调性--简单分析

qq_45185504的博客 1131

探索 Flutter 中的动画:使用 flutter_animate

flutter_animate 是一个 Flutter 插件,它使开发者能够以一种直观而简单的方式添加动画效果到他们的应用中。该库提供了多种动画效果和选项,包括缩放、旋转、淡入淡出等,可以轻松地应用于各种 UI 元素,如按钮、文本、图像等。

爱喝水程序员的博客 1471

世界模型和大语言模型结合开发自动驾驶算法

摘要:自动驾驶系统开发中,融合世界模型和大语言模型可显著提升效率和安全性。世界模型负责环境感知与预测(如目标检测、轨迹预测),而大语言模型优化代码生成、决策解释等环节。实施路径包括需求分析(1-2周)、模型开发(2-4个月)、模拟测试(1-2个月)、实车测试(2-3个月)和合规优化(1-2个月),总周期6-12个月。关键技术工具包括PyTorch/TensorFlow、CARLA模拟器和ROS系统,核心设计理念强调模块化、安全优先和敏捷迭代。示例代码展示了YOLO目标检测与大语言模型决策建议的集成方案。该方

ponygame的博客 826

FlightStream实战:如何用面元法在笔记本电脑上完成无人机气动分析(附NASA案例)

本文详细介绍了如何利用FlightStream面元法在笔记本电脑上高效完成无人机气动分析,包括其核心技术优势、NASA D8案例实战解析及高效工作流建立。FlightStream作为快速CFD分析工具,显著提升了早期设计阶段的迭代速度,适用于概念设计验证和多气动构型比较。

weixin_28363123的博客 256

Flutter Animation动画

一,概述      Flutter动画库的核心类是Animation对象,它生成指导动画的值,Animation对象指导动画的当前状态(例如,是开始、停止还是向前或者向后移动),但它不知道屏幕上显示的内容。动画类型分为两类: 补简动画(Tween),定义了开始点和结束点、时间线以及定义转换时间和速度的曲线。然后由框架计算如何从开始点过渡到结束点。Tween是一个无状态(stateless)对象,需要begin和end值。Tween的唯一职责就是定义从输入范围到输出范围的映射。输入范围通常为0.0到1.0

大灰狼的小绵羊哥哥的博客 2444

【人工智能】《Deep Dive into LLMs like ChatGPT 》—— Andrej Karpathy 第三阶段:强化学习(Reinforcement Learning, RL)

摘要:强化学习(RL)阶段通过让模型自主生成并验证答案,突破SFT阶段的模仿局限,使其在数学、代码等领域形成独特的推理路径。RL流程包括批量生成解答、自动批改筛选正确路径,并采用PPO/GRPO算法优化模型。模型会自发涌现自我检查、回滚等策略,显著提升正确率(如AIME竞赛准确率从15%升至56%)。与SFT模型相比,RL模型具备主动链式思维、验算能力,响应时间更长但效果更优,形成真正的“思考模型”。三阶段对比显示,RL通过可验证题的对错奖励机制,赋予模型超越人类范式的推理能力。

奶爸的编程之路,也就一周冷个三天 148

Flutter部件学习之动画(animation)

使用内置的隐式动画小部件,是向应用程序添加动画的最简单方法。例如Container小部件的AnimatedContainer版本和Positioned小部件的AnimatedPositioned版本。这些小部件会自动以动画方式对其属性进行更改,它们提供了一种添加动画而不增加额外复杂性的方法。当您使用新的属性值(例如使用StatefulWidget)重建小部件时,小部件会处理将动画从先前值驱动到新值。以Container和AnimatedContainer为例,1、Container() (图片转自:​​ht

weixin_43244083的博客 367

【系统分析师】第2章-基础知识:数学与工程基础(核心总结)

数学与工程基础

数据知道的博客 6812

【科研数据获取】根据Excel表个中的企业/公司信息批量获取经纬度坐标,并进行地图可视化

批量获取企业/公司的经纬度坐标,并进行地图可视化1 需求2 实现途径3 需求逐步实现 1 需求 在做项目的时候,老板或者项目答辩时候甲方最喜欢看到的就是可视化结果,尤其是涉及到地图可视化。很多时候会遇到企业/公司的数据,想要做地图可视化,必不可少的就是要获取它们具体地址:第一种就是像查户口一样精准一下具体的城镇街道,还有一种就是经纬度信息,前一种属于文字内容往往用于管理方面,第二种数字信息多用于数据处理与分析。 2 实现途径 获取地理信息数据,自然需要使用到地图的功能,这里直接采用百度地图的拾取坐标系统,

lys_828的博客 2336

【Flutter】动画学习(二) Animation

文章目录介绍基础动画AnimationAnimationControllerTweenAnimationCurvedAnimationAnimatedWidgetFadeTransition 显隐性ScaleTransition 缩放RotationTransition 旋转Transform.scale 缩放Transform.rotate 旋转Transform.translate 平移AnimatedOpacity 透明度核心代码复合动画隐性和缩放时间段动画自定义动画Hero 动画 介绍 在任何系统的

这家伙很懒,博客简介都不写 1万+

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 347

【Flutter】Animation 动画 ( Flutter 动画类型 | Flutter 动画的核心类 )

一、Flutter 动画类型、 二、Flutter 动画的核心类、 三、相关资源

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1319

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Flutter 动画 Animation、AnimationController、AnimatedWidget、AnimatedBuilder示例

文章目录动画 动画

龙衣 1630

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Flutter动画 2 - Animation、Tween 详解

简述 在 Flutter动画 1 - 实现一个最简单的动画 中,我们只使用到AnimationController就实现了一个简单的动画,但是如果映射的值复杂多变,或者想让值映射成颜色等等,这时候单个AnimationController就不能实现我们的需求了,这时候就需要使用到 Tween 以及 Animation. 其实在 Flutter动画 1 中, 我也是用了取巧的方案,对于AnimationController,我们要尽量保持它的单一职责性,他就是来管理动画的执行,过程等,它不应该管控每一个..

得不到的永远是骚栋. 1215

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

flutter动画 Animation,Curve,AnimationController,Tween,Hero

1.Animation Animation是一个抽象类,它本身和UI渲染没有任何关系,而它主要的功能是保存动画的插值和状态;其中一个比较常用的Animation类是Animation<double>。Animation对象是一个在一段时间内依次生成一个区间(Tween)之间值的类。Animation对象在整个动画执行过程中输出的值可以是线性的、曲线的、一个步进函数或者任何其他曲线函数...

litter_lj的博客 4507

Flutter动画 -- Curve,Animation和AnimationController

Curve  缓和曲线,即单位区间到单位区间的映射,也就是动画在某一段时间内的变化特性,缓动曲线是用来随着时间的推移调整动画的变化率,允许它们加速或者减速,而不是以恒定的速度移动.  缓动曲线的映射当0.0必须映射到0.0上,1.0必须映射到1.0上。  这个类是一个抽象类,下面是它的部分源码: @immutable abstract class Curve { const Curve(); ...

ffa_ijj的博客 1873

探索Flutter世界的创新动画库:flutter_sequence_animation

探索Flutter世界的创新动画库:flutter_sequence_animation 在Flutter开发中,创建引人入胜的动画效果是提升用户体验的关键。今天,我们向您推荐一个旨在简化序列动画实现的开源项目——flutter_sequence_animation,它提供了无需计算时间百分比和多条动画同步的解决方案。 项目介绍 flutter_sequence_animation 是一个强大的工...

gitblog_01159的博客 508

推荐一款神奇的Flutter动画库:flutter_sequence_animation

推荐一款神奇的Flutter动画库:flutter_sequence_animation 在Flutter开发中,我们常常需要创建吸引眼球的、流畅的动画效果。今天,我要向大家推荐一个强大的工具——,它是一个专门用于实现序列和组合动画的库,可以让你轻松地制作出复杂的动画效果。 项目简介 flutter_sequence_animation 是由Norbert515开发的一个开源项目,它的主要目标是简...

gitblog_00022的博客 651

如何使用 Flutter 动画集:flutter-animation-set 指南

???????????? 如何使用 Flutter 动画集:flutter-animation-set 指南 项目介绍 ???? flutter-animation-set 是一个强大的 Flutter 包,旨在简化复杂的动画配置过程。它通过时间线的方式驱动分阶段动画,让开发者能够轻松地利用现成的动画组件或自定义动画集合到他们的应用中。该库支持多种预设的过渡和行为动画,适配了Apache-2.0许可,方便地提升了应用的视...

gitblog_00608的博客 809

Flutter Animation(1)动画的简单使用

在动画过程中,需要两个部分: 第一个就是动画控制类,它不需要知道在屏幕上显示什么。 第二个就是实际上的UI元素 1. 动画控制类 动画控制类有两部分: Animation Animation类对象是一个抽象类,支持泛型,我们常用的是Animation&lt;double&gt;,当然这里不仅仅是double,可以是任意一个对象。Animation对象本身和UI渲染没有任何关系,而是用于生产...

weixin_33686714的博客 448

14-flutter Animation 动画

动画 一 Animation 在Flutter中,Animation对象本身和UI渲染没有任何关系。Animation是一个抽象类,它拥有其当前值和状态(完成或停止)。其中一个比较常用的Animation类是Animation。 Flutter中的Animation对象是一个在一段时间内依次生成一个区间之间值的类。Animation对象的输出可以是线性的、曲线的、一个步进函数或者任何其他可以设计的...

github_36850997的博客 402

Flutter动画: Animation动画基础(一)

我的博客 要使用Flutter中动画, 首先要熟悉Flutter的动画基础概念和相关类。 Animation:Flutter中动画的核心类。 AnimationController:动画管理类。 Tween:补间对象,用于计算动画使用的数据范围之间的插值。 Listeners和StatusListeners:用于监听动画状态改变。 CurvedAnimation:用于定义非线性曲线动画 。 简单点说, 熟悉了上面几个术语和用法, 就基本入门了Flutter的动画基础. 但是没有一定使用经验, 上

大灰狼的小绵羊哥哥的博客 729

Flutter和Dart系列十二:动画(Animation)

一个App中如果能有优秀的动画效果,能让App看起来显得更加高大上。此篇我们就来介绍一下Flutter中Animation体系。 我们先来一个简单的例子,来实现透明度渐变动画: class FadeInDemo extends StatefulWidget { @override State createState() { return _FadeInDemoState...

xlh1191860939的博客 1378

Flutter-tutorials动画基础教程:掌握Flutter Hooks和Sequence Animation

想要为你的Flutter应用添加生动有趣的动画效果吗?Flutter-tutorials项目为你提供了完整的Flutter动画基础教程,帮助你轻松掌握Flutter Hooks和Sequence Animation两大核心动画技术。无论是新手还是有经验的开发者,都能在这里找到实用的动画实现方案和最佳实践指南。 ## 🎯 Flutter动画基础入门 Flutter提供了强大而灵活的动画系统,让

gitblog_00170的博客 623
上一篇: Flutter 路由
下一篇: Flutter Flex(Row Column,Expanded, Stack) 组件
Leonardo_Fibonacci
博客等级 码龄10年 110粉丝 247原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值