当前位置: 首页 > news >正文

Flutter笔记 - 关于 fit 属性以及相关知识的总结

Flutter笔记
关于 fit 属性以及相关知识的总结

作者李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/134344516


本文介绍了Flutter框架中 BoxFit 枚举不同枚举值的含义,以及归纳了开发中常见的以 BoxFit 为值的组件,如FittedBox组件Image、FadeInImage等等;以及非组件的工具,如DecorationImage类、applyBoxFit 函数,等等。


1. 概述

本文是一个总结,深入探讨了Flutter中BoxFit枚举的各个值及其在实际编程中的应用。BoxFit是一个关键的枚举,它描述了如何在BoxConstraints中对齐和调整Box,对于控制图像或其他可绘制对象的尺寸和对齐方式具有重要作用。

文中首先详细解释了BoxFit的七个枚举值:fill、contain、cover、fitWidth、fitHeight、none和scaleDown,并通过实例说明了它们在实际应用中的效果和使用场景。

接着,本文介绍了BoxFit在各种Flutter组件中的应用,包括FittedBox、Image、RawImage、FadeInImage和DecorationImage。这些组件在Flutter开发中非常常见,理解和掌握BoxFit的使用,可以帮助开发者更好地控制这些组件的显示效果。

本文也简单介绍了applyBoxFit函数。该函数是Flutter中painting库的一部分,它用于应用BoxFit枚举值。虽然在大多数情况下,开发者不需要直接使用这个函数,但在创建自定义的绘图代码,或者需要手动处理图像或其他可绘制对象的尺寸和对齐方式时,这个函数会非常有用。

此外,本文还介绍了如何在Rive库中使用BoxFit。Rive是一个用于制作动画以及相关交互效果的库,BoxFit在其中也发挥了重要作用。本文详细介绍了RiveAnimation.network、RiveAnimation.asset、RiveAnimation.file和RiveAnimation.memory的使用方法,帮助开发者在使用Rive库时,能够更好地控制动画的显示效果。

2. BoxFit——描述如何在BoxConstraints中对齐和调整Box的枚举

2.1 BoxFit 是什么

作为子组件,会被拉伸填充满父组件,这可能会导致图像变形,因为宽度和高度方向的拉伸比例可能不同。

2.2 BoxFit 枚举值的含义

2.2.1 fill

BoxFit.fill会拉伸子组件以完全填充父组件,这可能会导致子组件的宽高比被改变,因此可能会导致图像变形。这是因为宽度和高度方向的拉伸比例可能不同。这种方式不考虑子组件的宽高比,只关心父组件的空间,尽可能地填充满父组件的全部空间。

在这里插入图片描述

例如,如果你有一个正方形的空间,但是你的图像是一个长方形,那么使用BoxFit.fill,图像会被拉伸或压缩以填充整个正方形的空间,这可能会导致图像看起来扁平或过高。

2.2.2 contain

BoxFit.contain是按原始比例缩放图像,使图像尽可能大,同时确保图像完全位于目标框内。这可能会导致目标框的一部分空间没有被图像填充。

  • 如果图像的宽高比与目标框的宽高比不同,那么未填充的区域将会是空白的。

在这里插入图片描述

2.2.3 cover

BoxFit.cover是按原始比例缩放图像,使图像尽可能大,同时确保目标框完全被图像覆盖。

  • 如果图像的宽高比与目标框的宽高比不同,那么图像将会超出目标框,超出的部分将会被剪裁。

在这里插入图片描述

2.2.4 fitWidth

BoxFit.fitWidth是按原始比例缩放图像,使图像的宽度与目标框的宽度相等。

  • 如果图像的高度小于目标框的高度,那么图像的上下两边将会有空白。
  • 如果图像的高度大于目标框的高度,那么图像的上下两边将会被剪裁。

在这里插入图片描述

2.2.5 fitHeight

BoxFit.fitHeight是按原始比例缩放图像,使图像的高度与目标框的高度相等。

  • 如果图像的宽度小于目标框的宽度,那么图像的左右两边将会有空白。
  • 如果图像的宽度大于目标框的宽度,那么图像的左右两边将会被剪裁。

在这里插入图片描述

2.2.6 none

BoxFit.none是不对图像进行任何缩放,图像将会以其原始大小显示。

  • 如果图像的尺寸大于目标框的尺寸,那么图像将会超出目标框,超出的部分将会被剪裁。
  • 如果图像的尺寸小于目标框的尺寸,那么图像周围将会有空白。

在这里插入图片描述

2.2.7 scaleDown

BoxFit.scaleDown的行为与BoxFit.contain相同,但是它不会放大图像。

  • 如果图像的尺寸小于目标框的尺寸,那么图像将会以其原始大小显示,图像周围将会有空白。
  • 如果图像的尺寸大于目标框的尺寸,那么图像将会被缩小,以确保图像完全位于目标框内,图像周围可能会有空白。

在这里插入图片描述

3. 相关组件

3.1 FittedBox组件

FittedBox 组件根据fit属性的值来缩放和定位其子Widget。其构造函数为:

FittedBox({Key? key, BoxFit fit = BoxFit.contain, AlignmentGeometry alignment = Alignment.center, Clip clipBehavior = Clip.none, Widget? child
})

其中:

  • fit:一个BoxFit枚举值,指定如何在分配的空间中放置子Widget。默认值是BoxFit.contain,这意味着子Widget会被缩放以适应其父Widget,同时保持其原始的宽高比。
  • alignment:一个AlignmentGeometry对象,指定如何在FittedBox中对齐子Widget。默认值是Alignment.center,这意味着子Widget会被居中对齐。
  • clipBehavior:一个Clip枚举值,指定如何裁剪子Widget。默认值是Clip.none,这意味着子Widget不会被裁剪。
  • child:子Widget,它会被FittedBox缩放和定位。

例如:

class FittedBoxExample extends StatelessWidget {const FittedBoxExample({super.key});Widget build(BuildContext context) {return Container(height: 400,width: 300,color: Colors.blue,child: const FittedBox(fit: BoxFit.fill,child: Placeholder(),),);}
}
fillcovercontain
在这里插入图片描述在这里插入图片描述在这里插入图片描述
fitWidthfitHeightnonescaleDown
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

3.2 Image组件

Image是Flutter中的一个Widget,用于显示图像。它有多个构造函数,可以用于从不同的源加载图像。大多数构造函数都接受一个fit参数,这个参数是一个BoxFit枚举值,用于控制图像如何适应其当前分配的空间。

以下是Image的一些主要构造函数:

  1. Image.asset:用于从应用的资源目录中加载图像。fit参数用于控制图像如何适应其父Widget。
Image.asset('graphics/background.png',fit: BoxFit.fill,
)
  1. Image.network:用于从网络上加载图像。fit参数用于控制图像如何适应其父Widget。
Image.network('https://example.com/graphics/background.png',fit: BoxFit.cover,
)
  1. Image.file:用于从设备的文件系统上加载图像。fit参数用于控制图像如何适应其父Widget。
Image.file(File('/path/to/your/image.png'),fit: BoxFit.scaleDown,
)
  1. Image.memory:用于从内存中的Uint8List加载图像。fit参数用于控制图像如何适应其父Widget。
Image.memory(bytes,fit: BoxFit.contain,
)

在所有这些构造函数中,fit参数都是可选的。如果你不提供一个fit值,那么图像将会按照其原始尺寸显示,如果图像的尺寸大于其父Widget的尺寸,那么图像将会被剪裁。如果你提供了一个fit值,那么图像将会根据这个值来适应其父Widget。例如,如果你设置fit: BoxFit.cover,那么图像将会被缩放以完全覆盖其父Widget,可能会部分超出父Widget的范围。

3.3 RawImage组件

RawImage组件直接显示一个 dart:ui.Image 对象。这个组件主要用于在你需要直接处理 dart:ui.Image** 对象时使用,例如你从一个自定义的图像解码器获取了图像,或者你从一个原生插件获取了图像。

RawImage 组件使用 paintImage函数 来绘制图像,这个函数提供了对这个类上的各个字段的详细解释。

值得注意的是,RawImage 不会处理图像的释放。当你不再需要 RawImage 时,你需要手动调用 Image.dispose 来释放图像资源。

在大多数情况下,你不需要直接使用 RawImage。如果你只是需要显示一个图像,那么使用 Image组件会更简单,因为Image组件提供了从各种源(如网络、文件、资源等)加载图像的功能。但是,如果你需要更底层的控制,或者你需要处理 dart:ui.Image对象,那么RawImage可能会用到。

RawImage的构造函数为:

const RawImage(Key? key,Image? image, // 要显示的图像,这是一个dart:ui.Image对象String? debugImageLabel, // 图像的描述标签,仅在调试模式下使用double? width, // 图像的宽度,如果为空,则图像的原始宽度将被使用double? height, // 图像的高度,如果为空,则图像的原始高度将被使用double scale = 1.0, // 图像的缩放比例Color? color, // 与图像混合的颜色Animation<double>? opacity, // 图像的不透明度,范围从0.0(完全透明)到1.0(完全不透明)BlendMode? colorBlendMode, // 用于控制颜色如何与图像混合的模式BoxFit? fit, // 图像的适应模式,用于控制图像如何适应其当前分配的空间AlignmentGeometry alignment = Alignment.center, // 图像在其父widget中的对齐方式ImageRepeat repeat = ImageRepeat.noRepeat, // 图像的重复模式,例如,如果图像小于其分配的空间,那么图像可以重复以填充空间Rect? centerSlice, // 图像的中心切片,用于控制图像如何被拉伸bool matchTextDirection = false, // 图像是否应根据当前的文本方向进行翻转bool invertColors = false, // 图像的颜色是否应被反转FilterQuality filterQuality = FilterQuality.low, // 图像的过滤质量bool isAntiAlias = false // 图像是否应使用抗锯齿渲染
)

可见,与 Image 组件一样,RawImage组件也有一个fit 属性。一个示意用法的例子如下:

RawImage(image: image, // dart:ui.Image对象scale: 1.0,width: 100.0,height: 200.0,color: Colors.red,colorBlendMode: BlendMode.modulate,fit: BoxFit.cover,
)

3.4 FadeInImage组件

FadeInImage 组件 类似于 Image 组件。FadeInImage 组件在目标图像加载时显示一个 占位符图像,然后在图像加载完成时 通过淡入动画显示新图像

这个类非常适合用于 显示加载时间较长的图像,例如网络图像,因为它可以让图像以优雅的动画效果出现在屏幕上,而不是突然出现。

FadeInImage还提供了一些属性来控制动画的行为,例如fadeOutDuration和fadeOutCurve用于控制占位符的淡出动画,fadeInDuration和fadeInCurve用于控制目标图像的淡入动画。

3.4.1 FadeInImage构造函数

FadeInImage({Key? key,required ImageProvider<Object> placeholder, // 占位符图像ImageErrorWidgetBuilder? placeholderErrorBuilder, // 占位符图像加载错误时的回调required ImageProvider<Object> image, // 目标图像ImageErrorWidgetBuilder? imageErrorBuilder, // 目标图像加载错误时的回调bool excludeFromSemantics = false, // 是否从语义树中排除此图像String? imageSemanticLabel, // 图像的语义标签Duration fadeOutDuration = const Duration(milliseconds: 300), // 占位符图像淡出的持续时间Curve fadeOutCurve = Curves.easeOut, // 占位符图像淡出的曲线Duration fadeInDuration = const Duration(milliseconds: 700), // 目标图像淡入的持续时间Curve fadeInCurve = Curves.easeIn, // 目标图像淡入的曲线double? width, // 图像的宽度double? height, // 图像的高度BoxFit? fit, // 目标图像的适应模式BoxFit? placeholderFit, // 占位符图像的适应模式FilterQuality filterQuality = FilterQuality.low, // 目标图像的过滤质量FilterQuality? placeholderFilterQuality, // 占位符图像的过滤质量AlignmentGeometry alignment = Alignment.center, // 图像的对齐方式ImageRepeat repeat = ImageRepeat.noRepeat, // 图像的重复模式bool matchTextDirection = false // 图像是否应根据当前的文本方向进行翻转
})

其 fit 属性的含义与用法与之前相同,不再赘述。

3.4.2 assetNetwork构造函数

FadeInImage.assetNetwork({Key? key, // Widget的标识符required String placeholder, // 占位符图像的资源名称ImageErrorWidgetBuilder? placeholderErrorBuilder, // 占位符图像加载错误时的回调required String image, // 目标图像的URLImageErrorWidgetBuilder? imageErrorBuilder, // 目标图像加载错误时的回调AssetBundle? bundle, // 用于加载占位符图像的资源包double? placeholderScale, // 占位符图像的缩放比例double imageScale = 1.0, // 目标图像的缩放比例bool excludeFromSemantics = false, // 是否从语义树中排除此图像String? imageSemanticLabel, // 图像的语义标签Duration fadeOutDuration = const Duration(milliseconds: 300), // 占位符图像淡出的持续时间Curve fadeOutCurve = Curves.easeOut, // 占位符图像淡出的曲线Duration fadeInDuration = const Duration(milliseconds: 700), // 目标图像淡入的持续时间Curve fadeInCurve = Curves.easeIn, // 目标图像淡入的曲线double? width, // 图像的宽度double? height, // 图像的高度BoxFit? fit, // 目标图像的适应模式BoxFit? placeholderFit, // 占位符图像的适应模式FilterQuality filterQuality = FilterQuality.low, // 目标图像的过滤质量FilterQuality? placeholderFilterQuality, // 占位符图像的过滤质量AlignmentGeometry alignment = Alignment.center, // 图像的对齐方式ImageRepeat repeat = ImageRepeat.noRepeat, // 图像的重复模式bool matchTextDirection = false, // 图像是否应根据当前的文本方向进行翻转int? placeholderCacheWidth, // 占位符图像的缓存宽度int? placeholderCacheHeight, // 占位符图像的缓存高度int? imageCacheWidth, // 目标图像的缓存宽度int? imageCacheHeight // 目标图像的缓存高度
})

其 fit 属性的含义与用法与之前相同,不再赘述。

3.4.3 memoryNetwork构造函数

FadeInImage.memoryNetwork({Key? key, // Widget的标识符required Uint8List placeholder, // 占位符图像的字节ImageErrorWidgetBuilder? placeholderErrorBuilder, // 占位符图像加载错误时的回调required String image, // 目标图像的URLImageErrorWidgetBuilder? imageErrorBuilder, // 目标图像加载错误时的回调double placeholderScale = 1.0, // 占位符图像的缩放比例double imageScale = 1.0, // 目标图像的缩放比例bool excludeFromSemantics = false, // 是否从语义树中排除此图像String? imageSemanticLabel, // 图像的语义标签Duration fadeOutDuration = const Duration(milliseconds: 300), // 占位符图像淡出的持续时间Curve fadeOutCurve = Curves.easeOut, // 占位符图像淡出的曲线Duration fadeInDuration = const Duration(milliseconds: 700), // 目标图像淡入的持续时间Curve fadeInCurve = Curves.easeIn, // 目标图像淡入的曲线double? width, // 图像的宽度double? height, // 图像的高度BoxFit? fit, // 目标图像的适应模式BoxFit? placeholderFit, // 占位符图像的适应模式FilterQuality filterQuality = FilterQuality.low, // 目标图像的过滤质量FilterQuality? placeholderFilterQuality, // 占位符图像的过滤质量AlignmentGeometry alignment = Alignment.center, // 图像的对齐方式ImageRepeat repeat = ImageRepeat.noRepeat, // 图像的重复模式bool matchTextDirection = false, // 图像是否应根据当前的文本方向进行翻转int? placeholderCacheWidth, // 占位符图像的缓存宽度int? placeholderCacheHeight, // 占位符图像的缓存高度int? imageCacheWidth, // 目标图像的缓存宽度int? imageCacheHeight // 目标图像的缓存高度
})

其 fit 属性的含义与用法与之前相同,不再赘述。

4. DecorationImage类

DecorationImage 是 Flutter中的一个类,它用于在装饰(如BoxDecoration)中显示图像,以配置如何在装饰中绘制图像的。

它不是一个 Widget

DecorationImage({required ImageProvider<Object> image, // 要显示的图像,这是一个ImageProvider对象,例如AssetImage、NetworkImage等。ImageErrorListener? onError, // 加载图像时发生错误的回调函数。ColorFilter? colorFilter, // 应用于图像的颜色过滤器。BoxFit? fit, // 图像的适应模式,用于控制图像如何适应其分配的空间。AlignmentGeometry alignment = Alignment.center, // 图像在装饰中的对齐方式。Rect? centerSlice, // 图像的中心切片,用于控制图像如何被拉伸。ImageRepeat repeat = ImageRepeat.noRepeat, // 图像的重复模式,例如,如果图像小于其分配的空间,那么图像可以重复以填充空间。bool matchTextDirection = false, // 图像是否应根据当前的文本方向进行翻转。double scale = 1.0, // 图像的缩放比例。double opacity = 1.0, // 图像的不透明度,范围从0.0(完全透明)到1.0(完全不透明)。FilterQuality filterQuality = FilterQuality.low, // 图像的过滤质量。bool invertColors = false, // 图像的颜色是否应被反转。bool isAntiAlias = false // 图像是否应使用抗锯齿渲染。
})

例如,下面的代码展示了其用法。

BoxDecoration(image: DecorationImage(image: AssetImage('graphics/background.png'), // 从应用的资源目录中加载图像fit: BoxFit.cover, // 图像会被缩放以完全覆盖其父Widget),
)

其中, fit 参数也是 BoxFit 类型,用法与之前所述一致。

5. 关于 applyBoxFit 函数

applyBoxFit函数是Flutter中painting库的一部分,它用于应用BoxFit枚举值。函数的定义如下:

FittedSizes applyBoxFit(BoxFit fit,Size inputSize,Size outputSize
)

其中:

  • fit:一个BoxFit枚举值,指定如何适应目标尺寸。
  • inputSize:源尺寸,即被适应的对象的尺寸。
  • outputSize:目标尺寸,即源尺寸需要适应的尺寸。

函数返回一个FittedSizes对象,它包含两个Size对象:source和destination。

  • FittedSizes.source:源尺寸应该被显示的部分。如果整个源尺寸都应该被显示,那么它将等于inputSize,但是如果源尺寸需要被裁剪,那么它可能会小于inputSize。
  • FittedSizes.destination:源尺寸应该被绘制的目标尺寸的部分。如果FittedSizes.destination小于outputSize,那么源尺寸将会被添加黑边(letterboxed)或柱状黑边(pillarboxed)。

这个函数不会对源尺寸和目标尺寸在输入和输出矩形中的对齐方式表达任何意见。通常,它们是居中的(这是BoxDecoration的行为,也是BoxFit的定义)。Alignment类提供了一个方便的函数Alignment.inscribe,用于将尺寸解析为矩形。

在大多数情况下,你不需要直接使用这个函数。但是,除非你正在创建自定义的绘图代码,或者需要手动处理图像或其他可绘制对象的尺寸和对齐方式时,才会用到。

以下是一个使用applyBoxFit函数的例子:

void paintImage(ui.Image image, Rect outputRect, Canvas canvas, Paint paint, BoxFit fit) {final Size imageSize = Size(image.width.toDouble(), image.height.toDouble());final FittedSizes sizes = applyBoxFit(fit, imageSize, outputRect.size);final Rect inputSubrect = Alignment.center.inscribe(sizes.source, Offset.zero & imageSize);final Rect outputSubrect = Alignment.center.inscribe(sizes.destination, outputRect);canvas.drawImageRect(image, inputSubrect, outputSubrect, paint);
}

在这个例子中,我们首先获取图像的尺寸,然后使用 applyBoxFit 函数来计算源尺寸应该被缩放和对齐到的尺寸。然后,我们使用Alignment.center.inscribe函数来计算源尺寸和目标尺寸应该被绘制的矩形。最后,我们使用canvas.drawImageRect函数来绘制图像。

5 Rive 库中的 fit

Rive 是一个用于制作动画以及相关交互效果的库。通常在里面制作好了相关的 .riv文件 ,从Rive软件导出后,作为静态资源放在 assets 目录中,或者将 .riv文件 放在一个静态文件服务器中。然后,通过 RiveAnimation 的不同构造方法在项目中使用。

当然,首先需要安装 rive 库:

flutter pub add rive

5.1 RiveAnimation.network

RiveAnimation.network 构造函数用于从网络加载Rive文件。例如:

RiveAnimation.network('https://example.com/myrivefile.riv',fit: BoxFit.contain,
)

其中, fit 参数也是 BoxFit 类型,用法与之前所述一致。

5.2 RiveAnimation.asset

RiveAnimation.asset:从项目的资源目录加载Rive文件。例如:

RiveAnimation.asset('assets/myrivefile.riv',fit: BoxFit.contain,
)

其中, fit 参数也是 BoxFit 类型,用法与之前所述一致。

5.3 RiveAnimation.file

RiveAnimation.file:从设备的文件系统加载Rive文件。例如:

RiveAnimation.file(File('/path/to/myrivefile.riv'),fit: BoxFit.contain,
)

其中, fit 参数也是 BoxFit 类型,用法与之前所述一致。

5.4 RiveAnimation.file

RiveAnimation.memory:从内存加载Rive文件。例如:

RiveAnimation.memory(bytes,fit: BoxFit.contain,
)

其中,bytes是一个包含Rive文件数据的Uint8List。fit 参数也是 BoxFit 类型,用法与之前所述一致。

可见所有这些构造函数都接受一个fit参数,用于控制动画如何适应其分配的空间,以及一个alignment参数,用于控制动画在其分配的空间中的对齐方式。

相关文章:

Flutter笔记 - 关于 fit 属性以及相关知识的总结

Flutter笔记 关于 fit 属性以及相关知识的总结 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/13434451…...

如何在PPT中去除编辑密码?

&#xff1a;忘记PPT幻灯片密码&#xff1f;最简单的办法在这里&#xff01; 【摘要】&#xff1a;具体步骤如下&#xff1a;第一步百度搜索【密码帝官网】&#xff0c;第二步点击“立即开始”&#xff0c;在用户中心上传文件即可。不用下载软件&#xff0c;手机电脑都可以用。…...

Kotlin库实现多线程爬取数据

由于字数限制&#xff0c;以下是一个简化版的爬虫程序示例&#xff0c;使用了Kotlin的网络库kotlinx.coroutines和kotlinx.html。这个程序会爬取一个简单的Python多线程跑数据的网页&#xff0c;并打印出结果。 import kotlinx.coroutines.* import kotlinx.html.* import java…...

RT-Thread Env使用

Env用户手册 Env是RT-Thread推出的开发辅助工具&#xff0c;针对基于RT-Thread操作系统的项目工程&#xff0c;提供编译构建环境、图形化系统配置及软件包管理功能。 其内置的menuconfig提供了简单易用的配置裁剪工具&#xff0c;可对内核、组件和软件包进行自由裁剪&#xf…...

2011年09月21日 Go生态洞察:Go图像处理包

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

《QT从基础到进阶·十七》QCursor鼠标的不同位置坐标获取

一些常用鼠标图形&#xff1a; 鼠标光标相对于整个电脑屏幕的位置&#xff1a;QCursor::pos() 当前光标相对于当前窗口的位置&#xff1a;this->mapFromGlobal(QCursor::pos()) void MainWindow::mouseReleaseEvent(QMouseEvent* event) {QPoint pos event->pos(); …...

K8s----资源管理

目录 一、Secret 1、创建 Secret 1.1 用kubectl create secret命令创建Secret 1.2 内容用 base64 编码&#xff0c;创建Secret 2、使用方式 2.1 将 Secret 挂载到 Volume 中&#xff0c;以 Volume 的形式挂载到 Pod 的某个目录下 2.2 将 Secret 导出到环境变量中 二、Co…...

java.net.UnknownServiceException: CLEARTEXT communication to 127.0.0.1 not p

解决方案3&#xff08;推荐&#xff09; 在 AndroidManifest.xml —> application节点中增加 <application...android:usesCleartextTraffic"true"... />...

STM32——系统时钟(概述,问题总结)

文章目录 前言系统时钟1.为什么32有那么多时钟源&#xff1f;2.主频有什么用?3.时钟与主频的关系&#xff1f;4.STM32提供了四种可选择的时钟源头。5.独立看门狗的时钟源只能是 LSI。 前言 系统时钟后续会出一个详细的关于STM32F103的系统时钟分析&#xff0c;可以关注一下。…...

魔众文库系统 v5.5.0 批量快捷上传,文档图标优化,档转换逻辑优化

魔众文库系统基于文档系统知识&#xff0c;建立平台与领域&#xff0c;打造流量、用户、付费和变现的闭环&#xff0c;帮助您更好的搭建文库系统。 魔众文库系统发布v5.5.0版本&#xff0c;新功能和Bug修复累计14项&#xff0c;批量快捷上传&#xff0c;文档图标优化&#xff…...

52. 携带研究材料

题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&#xff0c;它们各自占据不同的空间&#xff0…...

局域网内部服务器访问外部网络

​ 一、环境说明 如下图所示&#xff0c;局域网1中的服务器是可以访问外网的&#xff0c;局域网2中的服务器发出的数据包经过中间路由可以到达局域网1中的服务器。现在有一种需求需要使局域网2中的服务器也要能访问外网&#xff0c;这里考虑采用如下方法来实现。 ​​ 二、软…...

IP行业API助力于网络分析和数据挖掘

引言 在当今数字化时代&#xff0c;数据成为了企业、科研机构和政府决策者的重要资源&#xff0c;而IP行业API则成为了数据分析及挖掘的工具之一。IP行业API是一种能够查询IP地址所属的行业分类信息的应用程序接口&#xff0c;它能够提供在网络分析、用户行为分析及大数据挖掘…...

Azure 机器学习 - 如何使用模板创建安全工作区

目录 先决条件了解模板配置模板连接到工作区疑难解答错误&#xff1a;Windows 计算机名的长度不能超过 15 个字符&#xff0c;并且不能全为数字或包含以下字符 本教程介绍如何使用 [Microsoft Bicep]和 [Hashicorp Terraform]模板创建以下 Azure 资源&#xff1a; Azure 虚拟网…...

可变类与不可变类

可变类&#xff08;Mutable Class&#xff09;和不可变类&#xff08;Immutable Class&#xff09;是面向对象编程中的两种类的设计模式&#xff0c;它们在对象的状态和行为上有不同的特性。 可变类&#xff08;Mutable Class&#xff09;&#xff1a; 状态可修改&#xff1a;…...

什么是Node.js的调试器(debugger)工具?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

log4j CVE-2021-44228 RCE漏洞复现

一、漏洞特征 Apache Log4j 是 Apache 的一个开源项目&#xff0c;Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架&#xff0c;并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等&#xff0c;通过定义每一条日志信息的…...

leetcode 刷题 - 有效三角形个数 - 长度最小的子数组 - 无重复字符的最长子串

l611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1:输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示…...

如何更好的使用Copilot

Copilot从诞生到现在过去了挺长时间了&#xff0c;大家对Copilot的评价算是褒贬不一吧。有些人觉得Copilot高效且神奇&#xff0c;可以对自己的工作大大提效&#xff1b;有些觉得也就那样&#xff0c;为什么要花那么多钱做这个事情&#xff0c;钱它不香吗&#xff1f; 从最开始…...

C++ Qt 学习(五):Qt Web 编程

1. Chrome 技术介绍 大多数 web 技术都是基于 chrome&#xff0c;例如 CEF、QCefView 以及 QWebEngineView&#xff0c;这些都是在 native 界面里用来显示 html 网页&#xff0c;并且可以与 web 交互 例如常见的登录窗口、优酷的视频区域、WPS 的稻壳商城等&#xff0c;这些都…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...