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);}
}
相关文章:
Flutter动画学习二
如何在 Flutter 中使用自定义动画和剪裁(clipping)实现一个简单的动画效果。 前置知识点学习 AnimationController AnimationController 是 Flutter 动画框架中的一个核心类,用于控制动画的生命周期和状态。它提供了一种灵活的方式来定义动…...
flutter教程01 flutter项目的目录结构
Flutter开发基础 Dart语言: Flutter使用Dart语言进行开发。你需要熟悉Dart的基本语法和特性,如变量、数据类型、函数、类、继承、接口等。 Flutter组件: Flutter提供了丰富的UI组件库,你可以使用这些组件来构建你的用户界面。了…...
微软在AI时代的战略布局和挑战
微软的CEO萨提亚纳德拉(Satya Nadella)在与投资人比尔格里(Bill Gurley)和布拉德格斯特纳(Brad Gerstner)的一场深度对话中,详细回顾了微软在AI时代的战略布局与所面临的挑战。这场对话不仅总结…...
QT:程序异常结束原因
在确定DLL库没有问题的情况下,大概率是因为以下两点问题导致程序异常结束。 1、程序中存在对象只声明,未创建就使用的情况。程序中只声明了一个对象QObject * object,未进行object new QObject就直接使用object。这样,程序编译构…...
Linux搭建TRELLIS详细流程
TRELLIS是最新的3D生成模型,官网地址如下: https://github.com/microsoft/TRELLIS 下面是详细的搭建流程。 由于是在Ubuntu系统上搭建的,下面操作仅限Ubuntu系统查看。 不过Windows系统大同小异,而且青龙大佬已经做了相关整理。 Windows系统的可以去看青龙大佬的b站视…...
红米Note 9 Pro5G刷小米官方系统
前言 刷机有2种方式:线刷 和 卡刷。 线刷 线刷:需要用电脑刷机工具,例如:XiaoMiFlash.exe,通过电脑和数据线对设备进行刷机。 适用场景: 系统损坏无法开机。恢复官方出厂固件。刷机失败导致软砖、硬砖的…...
仓颉编程语言功能剖析:从设计理念到实际应用
引言 随着编程语言的发展,越来越多新兴语言试图解决传统编程语言的痛点,其中华为推出的仓颉编程语言(以下简称"仓颉")以其创新的理念和功能备受瞩目。仓颉以高效、易用、智能为核心设计目标,专注于提升开发…...
JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介
1. 基本概念 1.1、前言 web开发: web,网页的意思,www.baidu.com静态 web html,css提供给所有人看的数据始终不会发生变化! 动态 web 淘宝,几乎是所有的网站;提供给所有人看的数据始终会发生变化…...
五十一:HPACK如何减少HTTP头部的大小?
在现代的Web通信中,HTTP是最常用的协议。然而,随着网络应用程序的复杂化,HTTP头部的大小迅速增加,尤其是在HTTP/2中,由于其多路复用特性,多个请求和响应共享同一个连接,头部大小对性能的影响变得…...
windows11家庭版安装docker无法识别基于wsl2的Ubuntu
软件环境:windows11家庭版安装WSL2,Ubuntu22.04,docker4.34.2 问题描述:安装docker时,设置阶段无法识别Ubuntu22.04. 原因:windows11家庭版本默认没有Hyper-V 解决方案:将下述代码保存在新建记事本中&am…...
利用Spring Cloud Gateway Predicate优化微服务路由策略
利用Spring Cloud Gateway Predicate优化微服务路由策略 一、Predicate简介 Spring Cloud Gateway 是 Spring 生态系统中用于构建 API 网关的框架,它基于 Project Reactor 和 Netty 构建,旨在提供一种高效且灵活的方式来处理 HTTP 请求和响应。 Spring …...
谷歌浏览器的网络安全检测工具介绍
作为全球最受欢迎的浏览器之一,谷歌浏览器不仅提供了快速、便捷的浏览体验,还内置了一系列强大的网络安全检测工具,帮助用户识别潜在的网络威胁,保护个人隐私和数据安全。本文将详细介绍谷歌浏览器中的几项关键网络安全检测功能&a…...
Debian系统宝塔面板安装LiteSpeed Memcached(LSMCD)
参考链接 1. 官网指引: https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:lsmcd:installation 2. 安装OpenLiteSpeed官方LSMCD对象缓存替换Memcached详细图文教程 - 搬主题 实操记录: 首先LSMCD 默认的端口是11211,…...
termux下ubuntu换arm清华源
原官方源 deb http://ports.ubuntu.com/ubuntu-ports jammy main restricted universe multiversedeb http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted universe multiversedeb http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted un…...
计算机网络——练习题
一. 单选题(共27题,67.5分) 1. (单选题)计算机网络的最突出的优点是____。 A. 运算速度快 B. 运算精度高 C. 存储容量大 D. 资源共享 我的答案: D:资源共享;正确答案: D:资源共享; 2.5分 答案解析: 2. (单选题)TCP/IP协…...
单机游戏《野狗子》游戏运行时提示dbghelp.dll缺失是什么原因?dbghelp.dll缺失要怎么解决?
《野狗子》游戏运行时提示dbghelp.dll缺失:原因与解决方案 在畅游《野狗子》这款引人入胜的游戏世界时,突然遭遇“dbghelp.dll缺失”的错误提示,无疑会给玩家的探险之旅蒙上一层阴影。作为一名深耕软件开发领域的从业者,我深知此…...
飞搭系列 | 条件动态控制,打造个性化数字体验
前言 汉得飞搭aPaaS低代码平台(FEIDA,以下简称“飞搭”)是基于低代码理念打造的融合 aPaaS 平台,助力企业快速搭建业务应用。作为 HZERO 生态的重要组成部分,致力于充分融合 HZERO 的各平台能力,提供企业用…...
ssr实现方案
目录 序言 一、流程 二、前端要做的事情 三、节点介绍 四、总结 序言 本文不是详细的实现过程,是让你最快最直接的理解ssr的真正实现方法,有前端经验的同学,能够很好的理解过程,细节根据具体项目实现 一、前端要做的事情 1.…...
STM32高级物联网通信之以太网通讯
目录 以太网通讯基础知识 什么是以太网 互联网和以太网的区别 1)概念与范围 (1)互联网 (2)以太网 2)技术特点 (1)互联网 (2)以太网 3)应用场景 (1)互联网 (2)以太网 以太网的层次 1)物理层 2)数据链路层 OSI 7层模型 TCPIP 4层模型 一些常见…...
以太网帧、IP数据报图解
注:本文为 “以太网帧、IP数据报”图解相关文章合辑。 未整理去重。 以太网帧、IP数据报的图解格式(包含相关例题讲解) jueyuanfengsheng2023-08-07 11:49 一、基础知识 UDP 段、IP 数据包,以太网帧图示 通信过程中ÿ…...
外包干了两年,技术退步明显...
先说一下自己的情况,普通本科,曾在外包干了2年多的功能测试,再加上大环境不好,那时我整个人心惊胆战的,怕自己卷铺盖走人了,所以当时我感觉自己不能够在这样蹉跎下去了,长时间呆在一个舒适的环境…...
AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
前言 在当今科技迅猛发展的时代,人工智能(AI)技术正以前所未有的速度改变着我们的生活与工作方式。作为AI领域的重要盛会,CSIG青年科学家会议AI可信论坛汇聚了众多青年科学家与业界精英,共同探讨AI技术的最新进展、挑…...
vue中proxy代理配置(测试一)
接口地址:http://jsonplaceholder.typicode.com/posts 1、配置一(代理没起作用) (1)设置baseURL为http://jsonplaceholder.typicode.com (2)proxy为 ‘/api’:’ ’ (3&a…...
通用人工智能的关键:统一语言描述万物
当今世界,人工智能(AI)正以前所未有的速度推进着人类社会的进步。从最初的简单计算到如今能够执行复杂任务的智能系统,AI 的每一次飞跃都伴随着理解世界能力的显著提升。然而,要实现真正的通用人工智能——即能够像人类…...
使用QML实现播放器进度条效果
使用QML实现播放进度效果 QML Slider介绍 直接上DEMO如下: Slider {width: 300;height: 20;orientation: Qt.Vertical; //决定slider是横还是竖 默认是HorizontalstepSize: 0.1;value: 0.2;tickmarksEnabled: true; //显示刻度}效果图如下 那么我先改变滑块跟滚轮…...
TowardsDataScience 博客中文翻译 2018~2024(一百二十三)
TowardsDataScience 博客中文翻译 2018~2024(一百二十三) 引言 从 2018 年到 2024 年,数据科学的进展超越了许多技术领域的速度。Towards Data Science 博客依然是这个领域的关键平台,记录了从基础工具到前沿技术的多方面发展。…...
14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误“
出现这个错误是因为使用的 CentOS 7 仓库已经被归档,当前的镜像地址无法找到所需的文件。CentOS 7 的官方支持已经结束,部分仓库已被移至归档库。这导致了你的 yum 命令无法找到所需的元数据文件。CentOS 7 的官方仓库在 2024 年 6 月 30 日之后已经停止…...
将 ASP.NET Core 应用程序的日志保存到 D 盘的文件中 (如 Serilog)
将 ASP.NET Core 应用程序的日志保存到 D 盘的文件中,可以使用第三方日志库(如 Serilog)来实现。Serilog 是一个流行的日志库,支持将日志输出到文件、控制台、数据库等多种目标。 以下是实现步骤: 1. 安装 Serilog 相…...
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道 在现代后端开发中,表单验证是保证数据完整性和服务稳定性的核心环节。如何优雅、高效地实现表单验证,同时提供人性化的错误提示,是每位开发者的必修课。在本文中…...
相机主要调试参数
解析度测试 - 解释如何衡量摄像头捕捉细节的能力,确保图像清晰。锐度评估 - 教你如何判断图像边缘的清晰程度,以优化视觉效果。色散与色彩还原 - 分析色彩准确性,确保所见即所得的色彩一致性。白平衡校正 - 确保在各种光源下拍摄的照片颜色自…...
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码:引领智慧养老新时代 在当今老龄化社会日益严重的背景下,智慧养老已成为解决养老问题的重要途径。我们推出的JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码,正是基于这一需求而研发…...
一个简单封装的的nodejs缓存对象
我们在日常编码中,经常会用到缓存,而一个有效的缓存管理,也是大家必不可少的工具。而nodejs没有内置专用的缓存对象,并且由于js的作用域链的原因,很多变量使用起来容易出错,如果用一个通用的缓存管理起来&a…...
【ELK】filebeat采集数据输出到kafka指定topic
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 背景filebeat主体配置filebeat.inputs部分filebeat.output部分 filebeat完整配置 背景 今天收到需求,生产环境中通需要优化filebeat的输出,…...
Qt 6 QML Settings location 不创建指定路径文件
在 Qt QML 项目中可以使用Qt QSettings QML 版 Settings 方便数据持久化,具体使用可以参考Qt 文档,这里主要简单记录一下从Qt 5 升级到 Qt 6 后,没有创建指定的文件。在Qt 5中是使用 fileName 属性来指定文件路径,如下࿰…...
LabVIEW如何学习FPGA开发
FPGA(现场可编程门阵列)开发因其高性能、低延迟的特点,在实时控制和高速数据处理领域具有重要地位。LabVIEW FPGA模块为开发者提供了一个图形化编程平台,降低了FPGA开发的门槛。本篇文章将详细介绍LabVIEW FPGA开发的学习路径&…...
idea设置控制台日志输出自动换行
文章目录 1. 原因2. 方法一:3. 方法二: 1. 原因 你是否碰到ideal控制台输入日志是一行的效果,那是因为带了soft wrap。 2. 方法一: 最新版的IDEA设置控制台自动换行位置如下: Setting->Editor->General->C…...
帧缓存的分配
帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存,使用的是一个叫 ION 的内核模块,App 使用 ioctl 系统调用后,会在内核内存中分配一块符合要求的内存,用户态会拿到一个 fd(有的地方也称之为 handle&…...
Spitfire浏览器:为CodiggerDesktop打造的轻量级浏览新选择
近期,一款名为Spitfire的专业级轻量级浏览器凭借其卓越的性能和便捷的使用体验,吸引了科技界的广泛关注。这款浏览器是专为CodiggerDesktop用户量身打造的,旨在提供高速、流畅的浏览服务,满足开发者和设计者的多元化需求。 Spitfi…...
etcd+京东hotkey探测使用
qhotKey链接 京东hotkey把热点数据默认缓存在了本地缓存caffeine中,也可以存到redis中,但是京东hotkey的SDK没有redis的实现方法,因此需要自己实现。 官方目录结构下:分别是client客户端(要打包引入到自己的项目&…...
从源码分析swift GCD_DispatchGroup
前言: 最近在写需求的时候用到了DispatchGroup,一直没有深入去学习,既然遇到了那么就总结下吧。。。。 基本介绍: 任务组(DispatchGroup) DispatchGroup 可以将多个任务组合在一起并且监听它们的完成状态。…...
【最后203篇系列】002 - 两个小坑(容器时间错误和kafka模块报错
这里两个小坑填了,希望有用。 1 Multiple conflicting time zone configurations found:\n/etc/timezone: Asia/Shanghai\n/etc/localtime is a symlink to: Etc/UTC\nFix the configuration, or set the time zone in a TZ environment variable. 我碰到这个错误…...
StarRocks 生产部署一套集群,存储空间如何规划?
背景:StarRocks 3.2,存储一体 使用场景:多分析、小查询多单但不高、数据量几百T FE 存储 由于 FE 节点仅在其存储中维护 StarRocks 的元数据,因此在大多数场景下,每个 FE 节点只需要 100 GB 的 HDD 存储,…...
WebGL 项目外包开发流程
WebGL 项目外包开发流程与一般的软件项目外包流程类似,但由于 WebGL 的特殊性,在某些环节需要特别注意。以下是一个详细的 WebGL 项目外包开发流程。 1. 需求分析与定义 (明确目标是关键): 客户沟通与需求收集: 与客户进行深入沟…...
SQLMAP
Taeget 实践内容:练习使用 SQLMap 进行自动化 SQL 注入。 涉及知识点:理解 SQL 注入、SQLMap 工具使用、自动化攻击、Web 应用安全。 Trial 说明:Sqlmap是一个开源的渗透测试工具,可以自动检测和利用SQL注入漏洞,并…...
windwos defender实现白名单效果(除了指定应用或端口其它一律禁止)禁止服务器上网
一、应用场景说明 当我们的一台windows服务器中毒,变成别人肉鸡,不断向外请示非法网站或攻击其它服务器。 要彻底清除相关木马或病毒往往需要的时间比较长,比较有效的方法是禁止服务器主动向外发包除了网站端口和远程程序除外。 其实这就是一…...
模型库网站
目录 1 网站 1 网站 https://hf-mirror.com/ https://swanhub.co/models https://modelscope.cn/models https://www.suanjiayun.com/mirror?sourcebaidutg&bd_vid11787806978655223592...
5、栈应用-表达式求值
本章内容使用上述栈结构函数,来完成表达式求值操作。 表达式例如:3*(7-2) 或者 (0-12)*((5-3)*32)/(22) 。 1、实现思路 a、建立OPTR(运算符)和OPND(数字)两个栈,后输入字符串以结束 b、自左向…...
传统CV算法——基于opencv的答题卡识别判卷系统
基于OpenCV的答题卡识别系统,其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术,自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述: 1. 导入必要的库 系统首先导入…...
重温设计模式--原型模式
文章目录 原型模式定义原型模式UML图优点缺点使用场景C 代码示例深拷贝、浅拷贝 原型模式定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象; 核心中的核心就是 克隆clone ,后面讲 原型模式是一种创建型设计模式,它的主要…...
STM32在bootloader跳转到application时设置MSP
1. 简介 在做bootloader 跳转到application时,经常会看到设置MSP的操作__set_MSP(*(__IO uint32_t*) APPLICATION_ENTRY);。 1.1 MSP的作用 在STM32微控制器中,MSP(Main Stack Pointer,主堆栈指针)是一个非常重要的…...