【Flutter学习笔记】9.7 动画过渡组件

参考资料:《Flutter实战·第二版》9.7 动画过渡组件


“动画过渡组件”指的是在Widget属性发生变化时会执行过渡动画的组件,其最明显的一个特征就是会在内部管理一个AnimationControllercontroller定义了过渡动画的时长,而animation对象的定义过程中会指明动画的曲线、添加监听,通过Tween对象指明动画的区间起止值。

9.7.1 自定义动画过渡组件

要实现一个AnimatedDecoratedBox,它可以在decoration属性发生变化时,从旧状态变成新状态的过程可以执行一个过渡动画。想要实现一个外观改变过渡的组件,首先需要定义一个Stateful Widget,并提供需要输入的参数,包含、子Widget、曲线样式等,完整的实现代码如下:

import 'dart:ui';import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});// This widget is the root of your application.Widget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal),useMaterial3: true,),home: const MyHomePage(title: 'TEAL WORLD'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Theme.of(context).colorScheme.inversePrimary,title: Text(widget.title,style: TextStyle(color: Colors.teal.shade800, fontWeight: FontWeight.w900),),actions: [ElevatedButton(child: const Icon(Icons.refresh),onPressed: () {setState(() {});},)],),body: const AnimatedTestRoute(),floatingActionButton: FloatingActionButton(onPressed: () {},tooltip: 'Increment',child: Icon(Icons.add_box,size: 30,color: Colors.teal[400],),), // This trailing comma makes auto-formatting nicer for build methods.);}
}class AnimatedTestRoute extends StatefulWidget {const AnimatedTestRoute({super.key});AnimatedTestRouteState createState() => AnimatedTestRouteState();
}class AnimatedTestRouteState extends State<AnimatedTestRoute> with SingleTickerProviderStateMixin {Color _decorationColor = Colors.blue;var duration = const Duration(seconds: 1);Widget build(BuildContext context) {return AnimatedDecoratedBox1(duration: duration,decoration: BoxDecoration(color: _decorationColor),child: TextButton(onPressed: () {setState(() {_decorationColor = Colors.red;});},child: const Text("AnimatedDecoratedBox",style: TextStyle(color: Colors.white),),),);}
}class AnimatedDecoratedBox1 extends StatefulWidget {const AnimatedDecoratedBox1({Key? key,required this.decoration,required this.child,this.curve = Curves.linear,required this.duration,this.reverseDuration,}) : super(key: key);final BoxDecoration decoration;final Widget child;final Duration duration;final Curve curve;final Duration? reverseDuration;AnimatedDecoratedBox1State createState() => AnimatedDecoratedBox1State();
}class AnimatedDecoratedBox1State extends State<AnimatedDecoratedBox1>with SingleTickerProviderStateMixin {AnimationController get controller => _controller;late AnimationController _controller;Animation<double> get animation => _animation;late Animation<double> _animation;late DecorationTween _tween;Widget build(BuildContext context) {return AnimatedBuilder(animation: _animation,builder: (context, child) {return DecoratedBox(decoration: _tween.animate(_animation).value,child: child,);},child: widget.child,);}void initState() {super.initState();_controller = AnimationController(duration: widget.duration,reverseDuration: widget.reverseDuration,vsync: this,);_tween = DecorationTween(begin: widget.decoration);_updateCurve();}void _updateCurve() {_animation = CurvedAnimation(parent: _controller, curve: widget.curve);}void didUpdateWidget(AnimatedDecoratedBox1 oldWidget) {super.didUpdateWidget(oldWidget);if (widget.curve != oldWidget.curve) _updateCurve();_controller.duration = widget.duration;_controller.reverseDuration = widget.reverseDuration;//正在执行过渡动画if (widget.decoration != (_tween.end ?? _tween.begin)) {_tween..begin = _tween.evaluate(_animation)..end = widget.decoration;_controller..value = 0.0..forward();}}void dispose() {_controller.dispose();super.dispose();}
}

Flutter中,动画的产生是伴随Widget重构的,animation的值是一直变化的,但是只有Widget重建时UI界面才会随之变化。
初始化阶段,在使用AnimatedDecoratedBox组件的位置定义了样式类型和执行时长,传入组件后initState()方法中定义_controller_tween对象,随后定义_animation,此时动画还没有执行,且_tween的结束样式还没有定义。
然后通过build()方法构建UI界面,传入定义好的_animation对象并通过_tween.animate()方法取值设置盒子颜色,因为此时动画没执行,所以盒子是静止蓝色的。child元素是一个按钮,其按下时能够改变传入参数_decorationColor,使其变为红色。didUpdateWidget()方法在build()结束后会被调用进行一次重新构建(似乎是由鼠标hover引起的,暂时原因不明),但当前的参数并没有变化,而且widget.decoration的值还是蓝色,因此界面没有任何变化。通过在控制台打印信息可以印证该结论:
在这里插入图片描述
按钮还没有按下时(此时_tween.end==null_tween.begin为初始值),条件if (widget.decoration != (_tween.end ?? _tween.begin))不成立,不进行动画触发;
按钮按下时,由于AnimatedDecoratedBox的外部参数发生了变化,触发了didUpdateWidget()方法,此时上面的条件就成立了,也因此设置好了起止状态并开始了插值动画。动画进行时,子Widget(按钮)会不断的重新build,从控制台打印信息可以观察这一现象:

AnimatedDecoratedBox initState - decoration = BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3)))
AnimatedDecoratedBox build
Child build! - animated color = BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - decoration color = BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - begin=BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - end=null
didUpdateWidget
AnimatedDecoratedBox build
Child build! - animated color = BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - decoration color = BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - begin=BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - end=null
didUpdateWidget
AnimatedDecoratedBox build
Child build! - animated color = BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - decoration color = BoxDecoration(color: MaterialColor(primary value: Color(0xfff44336))) - begin=BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - end=BoxDecoration(color: MaterialColor(primary value: Color(0xfff44336)))
Child build! - animated color = BoxDecoration(color: Color(0xff2295f1)) - decoration color = BoxDecoration(color: MaterialColor(primary value: Color(0xfff44336))) - begin=BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - end=BoxDecoration(color: MaterialColor(primary value: Color(0xfff44336)))
...
Child build! - animated color = BoxDecoration(color: MaterialColor(primary value: Color(0xfff44336))) - decoration color = BoxDecoration(color: MaterialColor(primary value: Color(0xfff44336))) - begin=BoxDecoration(color: MaterialColor(primary value: Color(0xff2196f3))) - end=BoxDecoration(color: MaterialColor(primary value: Color(0xfff44336)))

应该注意的是,一般定义动画组件对象的方法都是内部定义controller和animation对象,只应用控制动画播放、反向播放等逻辑即可,其起止状态已知;但起止状态需要动作触发、且需要外部参数的组件,需要获取到终止状态才能进行动画。
上面例子的最终效果如图所示:
在这里插入图片描述
但上面的代码中,_controller的管理以及_tween的更新代码是可以通用的,Flutter中提供了已经封装好的基类ImplicitlyAnimatedWidget可以帮我们轻松地实现上述功能。AnimationController的管理就在ImplicitlyAnimatedWidgetState类中。如果要封装动画,要分别继承ImplicitlyAnimatedWidgetImplicitlyAnimatedWidgetState类。下面将介绍如何使用这两个类来实现同样的变色按钮。
首先继承ImplicitlyAnimatedWidget类,构造函数需要定义好要传入的参数和子Widget,父类中已经定义好了curvedurationreverseDuration这三个属性,其中duration为必传参数,curve的初始值为线性渐变:

class AnimatedDecoratedBox extends ImplicitlyAnimatedWidget {const AnimatedDecoratedBox({Key? key,required this.decoration,required this.child,Curve curve = Curves.linear,required Duration duration,}) : super(key: key,curve: curve,duration: duration,);final BoxDecoration decoration;final Widget child;_AnimatedDecoratedBoxState createState() {return _AnimatedDecoratedBoxState();}
}

其次,状态对象继承AnimatedWidgetBaseState(该类继承自ImplicitlyAnimatedWidgetState类)类。其中实现了build()forEachTween()两个方法,build()中直接通过animation的值构建每个动画帧内的子Widget,而forEachTween()则用来定义Tween对象的起止值。终止值是通过参数获取的,但初始值是有两种情况的:

  1. AnimatedDecoratedBox首次build,此时直接将其decoration值置为起始状态,和上面的描述相同 。
  2. AnimatedDecoratedBox的decoration更新时,则起始状态需要设置成当前的_tween.evaluate(_animation)值,显然这可能是一个在变化中的值。这个很难想,什么时候decoration会更新。首先只有当didUpdateWidget()触发的时候才会进行判断,也就是此刻外部传入的decoration发生了变化。无论在动画结束还是动画进行中,当终止状态发生改变时,要重新设置起点并开始动画。

继承AnimatedWidgetBaseState的代码如下:

class _AnimatedDecoratedBoxStateextends AnimatedWidgetBaseState<AnimatedDecoratedBox> {late DecorationTween _decoration = DecorationTween(begin: widget.decoration);Widget build(BuildContext context) {return DecoratedBox(decoration: _decoration.evaluate(animation),child: widget.child,);}void forEachTween(TweenVisitor<dynamic> visitor) {_decoration = visitor(_decoration,widget.decoration,(value) => DecorationTween(begin: value),) as DecorationTween;}
}

初始化时,通过(value) => DecorationTween(begin: value)构建Tween对象,只有起始值。而中间如果_decoration有变化,则更新起始值。其中visitor的定义如下:

 Tween<T> visitor(Tween<T> tween, //当前的tween,第一次调用为nullT targetValue, // 终止状态TweenConstructor<T> constructor,//Tween构造器,在上述三种情况下会被调用以更新tween);

实现效果依然和之前一样:
在这里插入图片描述
为了验证上面的第二点,可以做一个小实验,可以在调用 AnimatedDecoratedBox组件的地方再设计一个按钮,用于改变当前decoration参数的值,假设这里点击后decoration会变为绿色。当按钮颜色变化中或者变化结束时可以点击按钮观察颜色,这样就能判断“不同初始值”的含义了:

import 'dart:ui';import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});// This widget is the root of your application.Widget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal),useMaterial3: true,),home: const MyHomePage(title: 'TEAL WORLD'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Theme.of(context).colorScheme.inversePrimary,title: Text(widget.title,style: TextStyle(color: Colors.teal.shade800, fontWeight: FontWeight.w900),),actions: [ElevatedButton(child: const Icon(Icons.refresh),onPressed: () {setState(() {});},)],),body: const AnimatedTestRoute(),floatingActionButton: FloatingActionButton(onPressed: () {},tooltip: 'Increment',child: Icon(Icons.add_box,size: 30,color: Colors.teal[400],),), // This trailing comma makes auto-formatting nicer for build methods.);}
}class AnimatedTestRoute extends StatefulWidget {const AnimatedTestRoute({super.key});AnimatedTestRouteState createState() => AnimatedTestRouteState();
}class AnimatedTestRouteState extends State<AnimatedTestRoute> with SingleTickerProviderStateMixin {Color _decorationColor = Colors.blue;var duration = const Duration(seconds: 2);Widget build(BuildContext context) {return Row(children: [Expanded(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [AnimatedDecoratedBox(duration: duration,decoration: BoxDecoration(color: _decorationColor),child: TextButton(onPressed: () {setState(() {_decorationColor = Colors.red;});},child: const Text("AnimatedDecoratedBox",style: TextStyle(color: Colors.white),),),),const SizedBox(height: 20.0,),TextButton(onPressed: (){setState(() {_decorationColor = Colors.green;});}, child: const Text("Change Color!"))],))],);}
}class AnimatedDecoratedBox extends ImplicitlyAnimatedWidget {const AnimatedDecoratedBox({Key? key,required this.decoration,required this.child,Curve curve = Curves.linear,required Duration duration,}) : super(key: key,curve: curve,duration: duration,);final BoxDecoration decoration;final Widget child;AnimatedDecoratedBoxState createState() {return AnimatedDecoratedBoxState();}
}class AnimatedDecoratedBoxStateextends AnimatedWidgetBaseState<AnimatedDecoratedBox> {late DecorationTween _decoration = DecorationTween(begin: widget.decoration);Widget build(BuildContext context) {return DecoratedBox(decoration: _decoration.evaluate(animation),child: widget.child,);}void forEachTween(TweenVisitor<dynamic> visitor) {_decoration = visitor(_decoration,widget.decoration,(value) => DecorationTween(begin: value),) as DecorationTween;}
}

为了便于观察,我们可以把duration设置为2s,此时,如果在按钮完全变成红色后,点击下面的按钮,颜色就会从红色变成绿色:
在这里插入图片描述
如果在变色过程中点击下面的按钮,就会从蓝红中间的某个过渡色再花上2s变成绿色:
在这里插入图片描述

9.7.2 Flutter预置的动画过渡组件

Flutter SDK中也预置了很多动画过渡组件,实现方式和大都和AnimatedDecoratedBox差不多:

组件名功能
AnimatedPadding在padding发生变化时会执行过渡动画到新状态
AnimatedPositioned配合Stack一起使用,当定位状态发生变化时会执行过渡动画到新的状态。
AnimatedOpacity在透明度opacity发生变化时执行过渡动画到新状态
AnimatedAlign当alignment发生变化时会执行过渡动画到新的状态。
AnimatedContainer当Container属性发生变化时会执行过渡动画到新的状态。
AnimatedDefaultTextStyle当字体样式发生变化时,子组件中继承了该样式的文本组件会动态过

可以通过下面的示例代码来查看具体运行效果:

import 'package:flutter/material.dart';class AnimatedWidgetsTest extends StatefulWidget {const AnimatedWidgetsTest({Key? key}) : super(key: key);_AnimatedWidgetsTestState createState() => _AnimatedWidgetsTestState();
}class _AnimatedWidgetsTestState extends State<AnimatedWidgetsTest> {double _padding = 10;var _align = Alignment.topRight;double _height = 100;double _left = 0;Color _color = Colors.red;TextStyle _style = const TextStyle(color: Colors.black);Color _decorationColor = Colors.blue;double _opacity = 1;Widget build(BuildContext context) {var duration = const Duration(milliseconds: 400);return SingleChildScrollView(child: Column(children: <Widget>[ElevatedButton(onPressed: () {setState(() {_padding = 20;});},child: AnimatedPadding(duration: duration,padding: EdgeInsets.all(_padding),child: const Text("AnimatedPadding"),),),SizedBox(height: 50,child: Stack(children: <Widget>[AnimatedPositioned(duration: duration,left: _left,child: ElevatedButton(onPressed: () {setState(() {_left = 100;});},child: const Text("AnimatedPositioned"),),)],),),Container(height: 100,color: Colors.grey,child: AnimatedAlign(duration: duration,alignment: _align,child: ElevatedButton(onPressed: () {setState(() {_align = Alignment.center;});},child: const Text("AnimatedAlign"),),),),AnimatedContainer(duration: duration,height: _height,color: _color,child: TextButton(onPressed: () {setState(() {_height = 150;_color = Colors.blue;});},child: const Text("AnimatedContainer",style: TextStyle(color: Colors.white),),),),AnimatedDefaultTextStyle(child: GestureDetector(child: const Text("hello world"),onTap: () {setState(() {_style = const TextStyle(color: Colors.blue,decorationStyle: TextDecorationStyle.solid,decorationColor: Colors.blue,);});},),style: _style,duration: duration,),AnimatedOpacity(opacity: _opacity,duration: duration,child: TextButton(style: ButtonStyle(backgroundColor: MaterialStateProperty.all(Colors.blue)),onPressed: () {setState(() {_opacity = 0.2;});},child: const Text("AnimatedOpacity",style: TextStyle(color: Colors.white),),),),AnimatedDecoratedBox1(duration: Duration(milliseconds: _decorationColor == Colors.red ? 400 : 2000),decoration: BoxDecoration(color: _decorationColor),child: Builder(builder: (context) {return TextButton(onPressed: () {setState(() {_decorationColor = _decorationColor == Colors.blue? Colors.red: Colors.blue;});},child: const Text("AnimatedDecoratedBox toggle",style: TextStyle(color: Colors.white),),);}),)].map((e) {return Padding(padding: const EdgeInsets.symmetric(vertical: 16),child: e,);}).toList(),),);}
}

在这里插入图片描述
在这里插入图片描述
已有的过渡组件,可以直接通过定义参数的方式进行设置,而完全无需担心动画相关逻辑的维护,为开发带来了极大的便利。通过自定义组件,可以更深入地理解动画过渡组件的实现原理,以达到更为复杂的动画过渡效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/280902.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode每日一题1969

目录 一.题目原型&#xff1a; 二思路解析&#xff1a; 三.代码实现: 一.题目原型&#xff1a; 二思路解析&#xff1a; 灵神的做法非常让人惊叹&#xff1a; 理解就是&#xff0c;如果一个数大于另一个数要交换的1的权重&#xff0c;那么他们的乘积就变小。 那么一个大的数…

蓝桥-K倍区间--前缀和

题目描述&#xff1a; 给定一个长度为 NN 的数列&#xff0c;A1,A2,…AN&#xff0c;如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K 的倍数&#xff0c;我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗&#xff1f; 输入格式 第一行包含两个…

centos7安装openGauss数据库

官网手册&#xff1a; https://opengauss.org/zh/download/ 操作系统选择centos&#xff0c;软件包类型选择极简版&#xff1a;https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.0.1/x86/openGauss-5.0.1-CentOS-64bit.tar.bz2 硬件&#xff1a;2c4g 安装手册&#xf…

STL_list文档使用介绍与底层代码实现简介

文章目录 list介绍list的使用构造函数&#xff08;constructor&#xff09;迭代器list capacitylist modify&#xff08;修改&#xff09;其他接口函数list迭代器失效问题 list实现基础框架(节点类&#xff09;基础框架&#xff08;迭代器类&#xff09;基础框架&#xff08;链…

实现安卓连接阿里云物联网平台(2)

完整工程链接 链接&#xff1a;https://pan.baidu.com/s/1ykcJHPBSKBXVMaMWKoVRvA?pwd8888 提取码&#xff1a;8888 &#xff08;1&#xff09;创建一个新工程 &#xff08;2&#xff09;添加mqtt包的依赖 implementation org.eclipse.paho:org.eclipse.paho.client.mqttv…

C++学习基础版(一)

目录 一、C入门 1、C和C的区别 2、解读C程序 3、命名空间 4、输入输出 &#xff08;1&#xff09;cout输出流 &#xff08;2&#xff09;endl操纵符 &#xff08;3&#xff09;cin输入流 二、C表达式和控制语句 1、数据机构 特别&#xff1a;布尔类型bool 2、算数运…

C#对于文件中的文件名判断问题

C#中对于文件名的判断问题&#xff0c;我们使用bool值进行值的传递&#xff0c;首先我们使用内置方法进行文件字符串匹配的bool值回传&#xff0c;我们打印出文件名以及相对应的bool&#xff0c;即可知道文件名是否真正生效 bool isHave fileName.Contains("Hello"…

Langchain-chatchat+ChatGlm3-6b部署

我的环境 升级了下配置&#xff0c;加载知识库成功 内存&#xff1a;16GB 32B 显卡&#xff1a;GTX1060-6G RTX4080 Laptop-12G 1. 基础环境准备 1.1. 安装anaconda&#xff0c;创建环境python版本3.11 conda create -n chatglm3 python3.11 conda activate chatglm3 1.…

我国高纯电子级过氧化氢产量逐渐增长 未来有望实现完全国产替代

我国高纯电子级过氧化氢产量逐渐增长 未来有望实现完全国产替代 高纯电子级过氧化氢是氧化氢产品中技术含量最高的细分品类&#xff0c;多用于印刷电路板蚀刻、硅片清洗、光刻胶剥离等方面。经过多年发展&#xff0c;高纯电子级过氧化氢制备工艺已经成熟&#xff0c;大致可分为…

大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 并训练自己的数据集

大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 概述 大模型微调(finetuning)以适应特定任务是一个复杂且计算密集型的过程。本文训练测试主要是基于主流的的微调方法:LoRA、Adapter、Prefix-tuning、P-tuning和Prompt-tuning,并对…

开篇介绍——蓝桥赛前冲刺(JavaB组)

开篇介绍 蓝桥杯赛事时间安排 专栏内容介绍 在接下来的几天时间内&#xff0c;老汉会不间断的更新该专栏&#xff0c;主要针对蓝桥杯B组赛事高频考点的复习巩固&#xff0c;其中包括老汉认为较优质的算法讲解&#xff08;文章、视频&#xff09;&#xff0c;以及对应的真题、…

关系型数据库mysql(2)SQL语句

目录 一.SQL语句简介 1.1SQL语言 1.2SQL语句分类 1.3SQL分类 1.4SQL 语言规范 二.数据库基本操作 2.1查看数据库中的库信息 2.2查看数据库中的表信息 数据库内查看 数据库外查看 2.3显示数据库的结构&#xff08;字段&#xff09; ​编辑 2.4 字段属性 2.5常见的数…

【Linux】文件属性信息、文件目录权限修改

Linux文件属性信息 在 Linux 中&#xff0c;ls命令用于列出目录内容&#xff0c;并提供了许多参数以定制输出和显示不同类型的信息。以下是一些常用的ls命令参数 -a显示所有文件和目录&#xff0c;包括以.开头的隐藏文件。-l使用长格式列出文件和目录的详细信息&#xff0c;包…

Blender 3D建模要点

3d模型可以为场景的仿真模拟带来真实感&#xff0c;它还有助于更轻松地识别场景中的所有内容。 例如&#xff0c;如果场景中的所有对象都是简单的形状&#xff0c;如立方体和圆形&#xff0c;则很难在仿真中区分对象。 1、碰撞形状与视觉形状 像立方体和球体这样的简单形状&a…

【JAVA笔记】IDEA配置本地Maven

文章目录 1 配置本地Maven1.1 Maven下载1.2 Maven安装与配置1.2.1 安装1.2.2 配置1.2.2.1 环境配置1.2.2.2 本地仓库配置 2 IDEA设置本地Maven 1 配置本地Maven 1.1 Maven下载 官网&#xff1a;http://maven.apache.org/下载地址&#xff1a;http://maven.apache.org/downloa…

机器学习-05-回归算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中回归算法&#xff0c;包括线性回归&#xff0c;岭回归&#xff0c;逻辑回归等部分。 参考 fit_transform,fit,transform区别和作用详解&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

HarmonyOS/OpenHarmony应用开发-HDC环境变量设置

hdc&#xff08;HarmonyOS Device Connector&#xff09;是 HarmonyOS 为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在 windows/linux/mac 系统上与真实设备或者模拟器进行交互。 hdc 工具通过 HarmonyOS SDK 获取&#xff0c;存放于 /Huawei/Sdk/openhar…

python统计分析——正态分布

参考资料&#xff1a;python统计分析【托马斯】 正态分布或高斯分布是所有分布函数中最重要的。这是由于当样本数足够大的时候&#xff0c;所有分布函数的平均值都趋近于正态分布。数学上正态分布的特征有平均数μ和标准差σ确定。 其中&#xff0c;-∞<x<∞&#xff0c;…

【STL基础】vector、stack、queue、list、pair、map、unordered_map、set、unordered_set(详细讲解)

vector、list、pair、unordered_map、unordered_set、stack、queue 参考文章&#xff1a; &#xff08;1&#xff09;【apollo】泛型编程 与 STL &#xff08;2&#xff09;c stack用法 入门必看 超详细 &#xff08;3&#xff09;C中queue的用法&#xff08;超详细&#xff0c…

7年产品老兵自述:无代码“导演”数字孪生!

文章导读&#xff1a; 有人说自己天生不适合体制内的工作&#xff0c;当不了金丝雀&#xff0c;只能做野飞的麻雀。但逃离体制&#xff0c;就真的能过上自己想要的生活吗&#xff1f;睿睿的回答是&#xff1a;可以&#xff01;且看内向天蝎男&#xff0c;如何离别体制、一路生…