Flutter动画学习二

如何在 Flutter 中使用自定义动画和剪裁(clipping)实现一个简单的动画效果。

前置知识点学习

AnimationController

`AnimationController` 是 Flutter 动画框架中的一个核心类,用于控制动画的生命周期和状态。它提供了一种灵活的方式来定义动画的开始、结束、暂停、反向和速度调节等功能。

主要属性

  • `duration`: 定义动画的时长。可以是 `Duration` 类型的值,如 `Duration(milliseconds: 500)`。
  • `vsync`: 一个 `TickerProvider`,用于防止动画在不需要时消耗资源。通常在 `State` 类中通过 `SingleTickerProviderStateMixin` 提供。
  • `value`: 表示动画当前的进度,范围通常是 0.0 到 1.0。
  • `lowerBound` 和 `upperBound`: 定义动画值的范围,默认是 0.0 到 1.0。

主要方法

  • `forward()`: 正向播放动画,从当前值到 `upperBound`。
  • `reverse()`: 反向播放动画,从当前值到 `lowerBound`。
  • `repeat()`: 循环播放动画,可以设置次数和是否反向。
  • `stop()`: 停止动画。
  • `reset()`: 将动画值重置为 `lowerBound`。
  • `dispose()`: 销毁控制器,释放资源。在 `State` 的 `dispose` 方法中调用。

监听器

  • `addListener()`: 添加一个回调函数,每当动画的值改变时调用。
  • `addStatusListener()`: 添加一个回调函数,每当动画的状态改变时调用,比如开始、结束、正向播放、反向播放等。

使用示例

以下是一个简单的例子,演示如何使用 `AnimationController` 创建一个简单的透明度动画:

import 'package:flutter/material.dart';class MyAnimationControllerExample extends StatefulWidget {const MyAnimationControllerExample({super.key});@override_MyAnimationControllerExampleState createState() {return _MyAnimationControllerExampleState();}
}class _MyAnimationControllerExampleStateextends State<MyAnimationControllerExample>with SingleTickerProviderStateMixin {late AnimationController _controller;@overridevoid initState() {super.initState();_controller =AnimationController(vsync: this, duration: const Duration(seconds: 2));_controller.addListener(() {setState(() {});});_controller.forward();}@overridevoid dispose() {_controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('AnimationController Example')),body: Center(child: Opacity(opacity: _controller.value,child: Container(width: 100,height: 100,color: Colors.blue,),),),);}
}

解释

  • `AnimationController`: 控制动画的时长和进度。
  • `SingleTickerProviderStateMixin`: 为 `vsync` 提供 `TickerProvider`,防止不必要的资源消耗。
  • `addListener`: 在动画值改变时更新 UI。
  • `forward`: 使动画从 `lowerBound` 开始到 `upperBound` 结束。

FloatingActionButton

`FloatingActionButton`(FAB)是 Flutter 中一个用于执行主操作的圆形按钮。它通常悬浮在应用界面的某个位置,用户可以通过点击它来触发特定的操作或功能。FAB 是 Material Design 的一部分,常见于各种应用中,用于吸引用户注意并方便地进行交互。

关键属性

  • `child`: 该属性用于指定按钮内部的内容,通常是一个图标(`Icon`)或文本(`Text`)。这个内容会在按钮的中心显示。
  • `onPressed`: 一个回调函数,当用户点击按钮时会被调用。这个属性是必需的,因为它定义了按钮的行为。
  • `tooltip`: 当用户长按按钮时显示的提示文本,通常用于描述按钮的功能。
  • `backgroundColor`: 按钮的背景颜色。
  • `foregroundColor`: 按钮内容(如图标或文本)的颜色。
  • `elevation`: 按钮的阴影深度,影响按钮的浮动效果。
  • `shape`: 定义按钮的形状,默认是圆形,也可以自定义为其他形状。
  • `heroTag`: 用于在页面切换时标识 FAB 的唯一标识符,默认提供避免动画冲突。

使用示例

下面是一个使用 `FloatingActionButton` 的简单示例:

import 'package:flutter/material.dart';class FloatingActionButtonExample extends StatelessWidget {const FloatingActionButtonExample({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('FloatingActionButton Example'),),body: const Center(child: Text("Press the button below!"),),floatingActionButton: FloatingActionButton(onPressed: () {print("FAB clicked!");},tooltip: 'Increment',child: const Icon(Icons.add),),floatingActionButtonLocation: FloatingActionButtonLocation.endDocked);}
}

解释

  • `Scaffold`: Flutter 提供的一个布局结构,支持 Material Design 的组件,包括 FAB。
  • `floatingActionButton`: `Scaffold` 的一个属性,用于指定屏幕上的 FAB。
  • `onPressed`: 定义当 FAB 被点击时的行为。在这个例子中,它只是打印一条消息。
  • `Icon`: 在 FAB 中展示的内容,在这个例子中是一个加号图标。
  • `floatingActionButtonLocation`: 用于定义 FAB 在屏幕中的位置,如居中、靠右或靠左等。

常见使用场景

  • 主要操作: FAB 通常用于执行应用的主要操作,如在邮件应用中创建新邮件、在社交应用中发布新内容等。
  • 辅助功能: 在一些应用中,FAB 可以用于快速访问某些辅助功能。
  • 动态操作: 在某些应用中,FAB 的功能可能会根据上下文动态变化,比如在不同的页面中执行不同的操作。

通过 `FloatingActionButton`,开发者可以在 Flutter 应用中轻松实现符合 Material Design 指导原则的交互元素。它是一个非常直观且易于使用的组件,用于增强用户体验。

CustomClipper

`CustomClipper` 是 Flutter 提供的一个抽象类,用于创建自定义剪裁(clipping)效果。通过实现 `CustomClipper`,你可以定义任意形状的剪裁路径,应用于组件的外观。

主要方法

`CustomClipper` 包含两个主要方法,你需要在子类中实现它们:

1.`getClip(Size size)`:

  • 返回一个 `Path` 对象,该对象定义了应该如何剪裁组件。
  • `Size` 参数提供了组件的大小,你可以根据这个大小来计算剪裁路径。

2.`shouldReclip(CustomClipper oldClipper)`:

  • 返回一个布尔值,决定是否需要重新剪裁。当剪裁路径依赖于某些动态变化的参数时,你需要在这个方法中进行判断。
  • 通常,如果你的剪裁路径是固定不变的,可以返回 `false`。

使用方法

1.创建一个 `CustomClipper` 子类:

  • 实现 `getClip` 方法来定义剪裁路径。
  • 实现 `shouldReclip` 方法来决定何时重新剪裁。

2.使用 `ClipPath` 或其他 `Clip*` 组件:

  • 将自定义 `CustomClipper` 实例传递给 `ClipPath`、`ClipRect`、`ClipOval` 等组件的 `clipper` 属性。

示例

以下是一个简单的示例,展示如何使用 `CustomClipper` 来创建一个三角形剪裁效果:

import 'package:flutter/material.dart';class TriangleClipper extends CustomClipper<Path> {@overridePath getClip(Size size) {final path = Path();path.moveTo(size.width / 2, 0);path.lineTo(size.width, size.height);path.lineTo(0, size.height);path.close();return path;}@overridebool shouldReclip(covariant CustomClipper<Path> oldClipper) {// 如果路径不依赖外部状态,可以返回 falsereturn false;}
}class CustomClipperExample extends StatelessWidget {const CustomClipperExample({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('CustomClipper Example'),),body: Center(child: ClipPath(clipper: TriangleClipper(), // 使用自定义的 TriangleClipperchild: Container(width: 200,height: 200,color: Colors.blue,),),),);}
}

解释

  • TriangleClipper`: 自定义的剪裁器,实现了一个简单的三角形路径。
  • `getClip` 方法: 定义了一个三角形的路径。
  • `ClipPath`: 使用 `TriangleClipper` 将子组件剪裁成三角形。

使用场景

  • 自定义形状: 当你需要超出标准形状的剪裁效果时,比如特定的波浪形、星形等。
  • 动态剪裁: 如果剪裁形状需要根据某些动态参数变化,可以通过 `shouldReclip` 来控制重新剪裁。
  • 视觉效果: 增强 UI 的视觉效果,通过不规则的形状吸引用户注意力。

lerpDouble函数解析

在 Flutter 中,`lerpDouble` 是一个用于在两个 `double` 值之间进行线性插值的方法。它通常用于动画和其他需要平滑过渡的场景。

主要功能

`lerpDouble` 的主要功能是根据给定的插值因子 `t`,计算出两个 `double` 值之间的中间值。这个过程称为线性插值(linear interpolation),简称 lerp。

方法签名

double? lerpDouble(num? a,num? b,double t,
)

参数

  • `a`: 起始值,可以是 `double` 或 `null`。如果为 `null`,则在计算时视为 0.0。
  • `b`: 结束值,可以是 `double` 或 `null`。如果为 `null`,则在计算时视为 0.0。
  • `t`: 插值因子,是一个介于 0.0 到 1.0 之间的 `double`。当 `t` 为 0.0 时,返回 `a`;当 `t` 为 1.0 时,返回 `b`;在这之间返回 `a` 和 `b` 的插值。

返回值

返回一个 `double` 类型的值,表示 `a` 和 `b` 之间的插值。如果 `a` 和 `b` 都为 `null`,则返回 `null`。

用法示例

以下是一个简单的示例,展示如何使用 `lerpDouble` 计算两个值之间的插值:

import 'dart:ui';void main() {double? start = 10.0;double? end = 20.0;double t = 0.25; // 插值因子double? interpolatedValue = lerpDouble(start, end, t);print('Interpolated Value: $interpolatedValue'); // 输出: Interpolated Value: 12.5
}

解释

  • 在上面的例子中,`start` 是 10.0,`end` 是 20.0,`t` 是 0.25。
  • `lerpDouble` 返回两个值之间的 25% 位置上的值,即 12.5。

使用场景

  • 动画: 在动画过程中,计算属性的中间值,比如位置、大小、透明度等。
  • 过渡效果: 在不同状态之间平滑过渡,例如颜色渐变、尺寸变化等。
  • 自定义插值: 在需要自定义插值逻辑的情况下,用于计算中间值。

`lerpDouble` 是一个简单却强大的工具,允许开发者在两个数值之间创建平滑的过渡效果,非常适合用于动画和动态 UI 变化中。

Path

在 Flutter 中,`Path` 是一个用于定义向量形状的类。它允许开发者创建复杂的几何图形,通过一系列的直线和曲线来定义路径。`Path` 类可以用于绘制形状、创建剪裁区域以及生成自定义绘制效果。

基本用法

`Path` 提供了一系列方法,用于定义形状的边界。以下是一些常用的方法:

  • `moveTo(double x, double y)`: 移动当前点到指定的坐标,开始新的子路径。
  • `lineTo(double x, double y)`: 从当前点绘制一条直线到指定的坐标。
  • `arcTo(Rect rect, double startAngle, double sweepAngle, bool forceMoveTo)`: 绘制一个圆弧,基于一个矩形的边界。
  • `quadraticBezierTo(double x1, double y1, double x2, double y2)`: 绘制一个二次贝塞尔曲线。
  • `cubicTo(double x1, double y1, double x2, double y2, double x3, double y3)`: 绘制一个三次贝塞尔曲线。
  • `close()`: 关闭当前子路径,连接最后一个点到第一个点,形成一个封闭的形状。

示例

下面是一个简单的示例,使用 `Path` 绘制一个三角形:

import 'package:flutter/material.dart';class PathExampleDemo extends StatelessWidget {const PathExampleDemo({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Path Example'),),body: Center(child: CustomPaint(size: const Size(200, 200),painter: TrianglePainter(),),),);}
}class TrianglePainter extends CustomPainter {@overridevoid paint(Canvas canvas, Size size) {final paint = Paint()..color = Colors.blue..style = PaintingStyle.fill;final path = Path();//顶点path.moveTo(size.width / 2, 0);//右下角path.lineTo(size.width, size.height);//左下角path.lineTo(0, size.height);path.close();canvas.drawPath(path, paint);}@overridebool shouldRepaint(covariant CustomPainter oldDelegate) {return false;}
}

解释

  • `CustomPainter`: 用于自定义绘制。`paint` 方法中使用 `Canvas` 对象进行绘制。
  • `Path`: 定义路径的形状。在这个例子中,绘制了一个简单的三角形。
  • `Canvas.drawPath`: 使用 `Path` 和 `Paint` 对象在画布上绘制路径。

使用场景

  • 自定义形状: `Path` 可以定义任意形状,用于自定义绘制或剪裁。
  • 复杂图形: 使用贝塞尔曲线和弧形,可以创建复杂的图形和路径。
  • 动画路径: 在动画中,可以使用 `Path` 来定义对象的运动轨迹。

注意事项

  • 路径方向: 在定义路径时,方向(顺时针或逆时针)可能会影响填充规则。
  • 性能: 复杂路径可能会影响性能,尤其是在动画中,请合理使用。

AnimatedBuilder

`AnimatedBuilder` 是 Flutter 动画框架中的一个小部件,用于将动画与 UI 组件进行绑定。它提供了一种高效的方法来重建与动画相关的部分 UI,而无需重建整个 widget 树。

核心概念

`AnimatedBuilder` 通过监听一个 `Listenable` 对象(通常是 `AnimationController` 或其他 `Animation` 对象)来决定何时重建 UI。当动画对象的值发生变化时,`AnimatedBuilder` 会调用其构建方法,从而更新与动画相关的 UI。

主要属性

  • `animation`: 一个 `Listenable` 对象,通常是 `Animation` 或 `AnimationController`。`AnimatedBuilder` 监听这个对象的变化。
  • `builder`: 一个回调函数,接受两个参数:`BuildContext` 和 `Widget`。在这个函数中,你可以根据动画的当前状态来构建和返回一个新的 widget 树。
  • `child`: 一个可选的小部件,当它在动画变化时不需要重建时,可以作为优化传递给 `builder`。这样可以避免不必要的重建。

使用示例

以下是一个使用 `AnimatedBuilder` 的简单示例,展示如何创建一个旋转动画:

import 'package:flutter/material.dart';class AnimatedBuilderExample extends StatefulWidget {const AnimatedBuilderExample({super.key});@override_AnimatedBuilderExampleState createState() {return _AnimatedBuilderExampleState();}
}class _AnimatedBuilderExampleState extends State<AnimatedBuilderExample>with SingleTickerProviderStateMixin {late AnimationController _controller;@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('AnimatedBuilder Example')),body: Center(child: AnimatedBuilder(animation: _controller,builder: (context, child) {return Transform.rotate(angle: _controller.value * 2.0 * 3.14,child: child,);},child: Container(width: 100,height: 100,color: Colors.blue,),),),);}@overridevoid initState() {super.initState();_controller =AnimationController(vsync: this, duration: const Duration(seconds: 2))..repeat(); //无限循环动画}@overridevoid dispose() {_controller.dispose();super.dispose();}
}

解释

  • `AnimationController`: 控制动画的时长和进度。在这个例子中,`_controller` 在 2 秒内从 0.0 到 1.0 循环。
  • `AnimatedBuilder`: 监听 `_controller` 的变化,并在 `builder` 回调中根据动画的当前值更新 UI。
  • `Transform.rotate`: 根据动画的当前值旋转 `child`,实现旋转效果。
  • `child`: 传递给 `AnimatedBuilder` 的 `child` 是一个蓝色的方块,它在动画期间不会重建。

使用场景

  • 动画优化: 当只有部分 UI 需要随着动画更新时,`AnimatedBuilder` 可以避免整个 widget 树的重建。
  • 复杂动画: 在需要多个动画组合或复杂动画效果时,`AnimatedBuilder` 提供了一种灵活的方式来管理和应用这些动画。

自定义动画代码学习

import 'dart:math';
import 'dart:ui';import 'package:flutter/material.dart';class AnimaDemoPage22 extends StatefulWidget {const AnimaDemoPage22({super.key});@override_AnimaDemoPageState22 createState() {return _AnimaDemoPageState22();}
}class _AnimaDemoPageState22 extends State<AnimaDemoPage22>with SingleTickerProviderStateMixin {late AnimationController controller;Animation? animation;@overridevoid initState() {super.initState();controller = AnimationController(vsync: this,duration: const Duration(milliseconds: 500),);animation = CurvedAnimation(parent: controller, curve: Curves.easeInSine);}@overridevoid dispose() {controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("AnimaDemoPage22"),),body: Container(color: Colors.blueGrey,child: MyCRAnimation(minR: 0,maxR: 250,offset: Offset(MediaQuery.sizeOf(context).width / 2,MediaQuery.sizeOf(context).height / 2),animation: animation as Animation<double>?,child: Center(child: Container(alignment: Alignment.center,height: 250,width: 250,color: Colors.greenAccent,child: const Text("动画测试"),),),),),floatingActionButton: FloatingActionButton(onPressed: () {if (controller.status == AnimationStatus.completed ||controller.status == AnimationStatus.forward) {controller.reverse();} else {controller.forward();}},child: const Text("点击"),),);}
}class MyCRAnimation extends StatelessWidget {final Offset? offset;final double? minR;final double? maxR;final Widget child;final Animation<double>? animation;const MyCRAnimation({super.key,required this.child,required this.animation,this.offset,this.minR,this.maxR});@overrideWidget build(BuildContext context) {return AnimatedBuilder(animation: animation!,builder: (_, __) {return ClipPath(clipper: MyAnimationClipper(value: animation!.value,minR: minR,maxR: maxR,offset: offset),child: child,);});}
}class MyAnimationClipper extends CustomClipper<Path> {final double? value;final double? minR;final double? maxR;final Offset? offset;MyAnimationClipper({this.value, this.offset, this.minR, this.maxR});@overridePath getClip(Size size) {var path = Path();var offset = this.offset ?? Offset(size.width / 2, size.height / 2);var maxRadius = minR ?? radiusSize(size, offset);var minRadius = maxR ?? 0;var radius = lerpDouble(minRadius, maxRadius, value!)!;var rect = Rect.fromCircle(center: offset, radius: radius);path.addOval(rect);return path;}@overridebool shouldReclip(covariant CustomClipper<Path> oldClipper) {return true;}double radiusSize(Size size, Offset offset) {final height = max(offset.dy, size.height - offset.dy);final width = max(offset.dx, size.width - offset.dx);return sqrt(width * width + height * height);}
}

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

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

相关文章

【专题】2024年悦己生活消费洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p38654 在当今时代背景下&#xff0c;社会发展日新月异&#xff0c;人们的生活方式与消费观念正经历深刻变革。MoonFox 月狐数据的《2024 年悦己生活消费洞察报告》聚焦于这一充满活力与变化的消费领域。随着就业、婚姻等社会压力的…

生产看板管理系统涵盖哪些方面

嘿&#xff0c;各位搞生产管理的朋友&#xff0c;肯定都碰到过些麻烦事儿吧。我就寻思着&#xff0c;能不能弄出个 “明明白白” 的工作场地呢&#xff1f;让员工和管理人员都能随时查查生产进度&#xff0c;一发现生产里有啥问题就能立马知道。 生产进度不好追踪生产过程不清…

密码学期末考试笔记

文章目录 公钥加密之前的部分 (非重点&#xff0c;关注工具怎么用&#xff0c;和性质)一、对称加密 (symmetric ciphers)1. 定义 二、PRG (伪随机数生成器)1. 定义2. 属性 三、语义安全 (Semantic Security)1. one-time key2. 流密码是语义安全的 四、分组密码 (Block Cipher)1…

workman服务端开发模式-应用开发-vue-element-admin挂载websocket

一、项目根目录main.js添加全局引入 import /utils/websocket 二、在根目录app.vue 中初始化WebSocket连接 <template><div id"app"><router-view /></div> </template><script>import store from ./store export default {n…

我的 2024 年终总结

2024 年&#xff0c;我离开了待了两年的互联网公司&#xff0c;来到了一家聚焦教育机器人和激光切割机的公司&#xff0c;没错&#xff0c;是一家硬件公司&#xff0c;从未接触过的领域&#xff0c;但这还不是我今年最重要的里程碑事件 5 月份的时候&#xff0c;正式提出了离职…

信创源代码加密的答案:信创沙箱

在信息化与工业化融合创新&#xff08;信创&#xff09;的背景下&#xff0c;企业面临着前所未有的数据安全挑战。SDC沙盒技术以其独特的隔离和保护机制&#xff0c;为信创环境提供了强有力的支持。以下是SDC沙盒在信创支持方面的优势&#xff0c;这些优势体现了其在保护企业数…

Leecode刷题C语言之根据第k场考试的分数排序

执行结果:通过 执行用时和内存消耗如下&#xff1a; int gk 0;int compare(const void* a, const void* b) {int* ua *(int**)a;int* ub *(int**)b;return ub[gk] - ua[gk]; }int** sortTheStudents(int** score, int scoreSize, int* scoreColSize, int k, int* returnSiz…

Linux 下SVN新手操作手册

下面来介绍Linux 下 SVN操作方法&#xff1a; 1、SVN的安装 Centos 7 安装Subversion sudo yum -y install subversion Ubuntu 安装Subversion sudo apt-get install subversion 自定义安装&#xff0c;官方地址&#xff1a;https://subversion.apache.org/ 2、SVN的使用…

ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关

目录 应用 1&#xff1a;它是相关性还是托布勒第一定律&#xff1f; 应用 2&#xff1a;将空间带入非空间模型 结论 在 ArcGIS Pro 3.4 中&#xff0c;我们在新的空间组件实用程序&#xff08;Moran 特征向量&#xff09;工具集中发布了一个新工具 - 从字段过滤空间自相关。…

自定义一个maven骨架 | 最佳实践

自定义一个maven骨架 | 最佳实践 目的&#xff1a;将一个多模块项目的基础结构制作成maven骨架&#xff0c;实现项目的快速构建&#xff0c;风格统一 公司内部会制定自己的规范及包结构。当创建新项目的时候就需要选择骨架&#xff0c;即可生成包结构。 Archetype都为不同类型的…

CTFHUB-web进阶(Bypassdisable_function)

LD_PRELOAD 来到首页发现有一句话直接就可以用蚁剑连接 根目录里有/flag但是不能看;命令也被ban了就需要绕过了 绕过工具在插件市场就可以下载 如果进不去的话 项目地址: #本地仓库;插件存放 antSword\antData\plugins 绕过选择 上传后我们点进去可以看到多了一个绕过的文件;…

workman服务端开发模式-GatewayWorker的使用

一、GatewayWorker介绍 Workerman是一个使用PHP开发的高性能组件&#xff0c;用于构建高性能的异步并发TCP、UDP、Unix Socket、HTTP、Websocket服务。 GatewayWorker是基于Workerman开发的一套TCP长连接的应用框架&#xff0c;实现了单发、群发、广播等接口&#xff0c;内置了…

oracle linux8.10+ oracle 23ai安装

介质准备&#xff1a; 数据库23ai https://edelivery.oracle.com 上述网站下载基础版本&#xff0c;本次未使用。 本次是安装了带补丁的版本&#xff1a; Database Release Update 23.6.0.24.10 GoldImage表示带补丁用于直接安装的软件包 查找888.1对应Primary Note for …

《软件设计的哲学》阅读摘要之设计原则

《软件设计的哲学》&#xff08;A Philosophy of Software Design&#xff09;是一本在软件架构与设计领域颇具影响力的书籍&#xff0c;作者 John Ousterhout 在书中分享了诸多深刻且实用的软件设计理念。书中列举的这些设计原则&#xff0c;汇聚了作者丰富的实战经验与深邃的…

uniApp打包H5发布到服务器(docker)

使用docker部署uniApp打包后的H5项目记录&#xff0c;好像和VUE项目打包没什么区别... 用HX打开项目&#xff0c;首先调整manifest.json文件 开始用HX打包 填服务器域名和端口号~ 打包完成后可以看到控制台信息 我们可以在web文件夹下拿到下面打包好的静态文件 用FinalShell或…

项目实战——高并发内存池

一.项目介绍 本项目——高并发内存池&#xff0c;是通过学习并模仿简化 google 的一个开源项目 tcmalloc &#xff0c;全称 Thread-Caching Malloc&#xff0c;即线程缓存的malloc&#xff0c;模拟实现了一个自己的高并发内存池&#xff0c;用于高效的多线程内存管理&#xff…

Apache Log4j漏洞复现

所用环境 宝塔云服务器 log4j2 是Apache的⼀个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞。 apache log4j通过定义每⼀条日志信息的级别能够更加细致地控制日志⽣成地过…

自动驾驶控制算法-横向误差微分方程LQR前馈控制

本文是学习自动驾驶控制算法第六讲 前馈控制与航向误差以及前两节的学习笔记。 1 横向误差微分方程 以规划的轨迹作为自然坐标系&#xff0c;计算自车在轨迹上的投影点&#xff0c;进而计算误差&#xff1a; 如图所示&#xff0c;横向误差为 d d d&#xff0c;航向误差为 θ…

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使&#xff0c;可以说是一坨… 关键词&#xff1a;Apache RocketMQ 5.0 JDK 17 废话少说&#xff0c;开整。 1.版本 官网地址&#xff0c;版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…

Google Cloud Kubernetes Anthos是什么,和Istio有什么关联

Google Cloud Platform (GCP) Kubernetes Anthos 是 Google 推出的一种多云管理平台&#xff0c;基于 Kubernetes&#xff0c;旨在帮助企业在多个云环境中管理和运行容器化应用程序。 https://cloud.google.com/blog/topics/hybrid-cloud/5-frequently-asked-questions-about-…