Flutter封装一个三方ViewPager学习
Flutter如何实现一个增强的 `PageView`,支持自定义页面切换动画。
前置知识点学习
CrossAxisAlignment
`CrossAxisAlignment` 是 Flutter 中用于控制布局子组件在交叉轴(cross axis)方向上的对齐方式的一个枚举类。它主要在 `Flex` 布局模型中使用,比如 `Row` 和 `Column` 这两个常用的小部件。
基本概念
在 Flutter 的布局系统中,`Row` 和 `Column` 这两个小部件使用的是 `Flex` 布局模型。它们的布局轴分别是水平和垂直的:
- 主轴(Main Axis):这是 `Row` 中的水平方向或 `Column` 中的垂直方向。
- 交叉轴(Cross Axis):这是 `Row` 中的垂直方向或 `Column` 中的水平方向。
`CrossAxisAlignment` 控制子组件在交叉轴方向上的对齐方式。
`CrossAxisAlignment` 枚举值
`CrossAxisAlignment.start`:
- 子组件在交叉轴的起始位置对齐。
- 在 `Column` 中,这意味着子组件会对齐到左边缘;在 `Row` 中,子组件会对齐到顶部边缘。
`CrossAxisAlignment.end`:
- 子组件在交叉轴的结束位置对齐。
- 在 `Column` 中,这意味着子组件会对齐到右边缘;在 `Row` 中,子组件会对齐到底部边缘。
`CrossAxisAlignment.center`:
- 子组件在交叉轴上居中对齐。
`CrossAxisAlignment.stretch`:
- 子组件会拉伸以填满交叉轴的可用空间。
- 这要求子组件的宽度(在 `Column` 中)或高度(在 `Row` 中)没有固定的约束。
`CrossAxisAlignment.baseline`:
- 子组件根据其文本的基线对齐。这个选项需要所有子组件都有文本基线。
- 仅适用于 `Row`,因为 `Column` 没有基线概念。
使用示例
下面是一个使用 `CrossAxisAlignment` 的简单示例:
import 'package:flutter/material.dart';class CrossAxisAlignmentExample extends StatelessWidget {const CrossAxisAlignmentExample({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("CrossAxisAlignment Example")),body: Column(crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[Container(color: Colors.red,height: 50,width: 200,child: const Text('Start Alignment',style: TextStyle(color: Colors.white)),),Container(color: Colors.green,height: 50,width: 150,child:const Text('Middle Box', style: TextStyle(color: Colors.white)),),Container(color: Colors.blue,height: 50,width: 100,child: const Text('End Box', style: TextStyle(color: Colors.white)),),],),);}
}
解释
`Column` 小部件:
- 设置 `crossAxisAlignment: CrossAxisAlignment.start`,这使得所有子组件在交叉轴(水平)上对齐到左边。
- 每个 `Container` 的宽度不同,但它们都从左侧开始对齐。
`CrossAxisAlignment` 的使用场景非常广泛,尤其是在需要精确控制子组件在交叉轴上的对齐方式时。下面是一些常见的应用场景和考虑事项:
适用场景
基本布局:
- 在构建基本的 UI 布局时,使用 `CrossAxisAlignment` 来确保子组件在交叉轴方向上的对齐方式符合设计需求。例如,在一个垂直的 `Column` 中,可能需要所有按钮左对齐以保持一致性。
响应式布局:
- 当设计需要适应不同屏幕尺寸的布局时,通过调整 `CrossAxisAlignment` 可以确保组件在不同设备上仍然保持良好的对齐和排列。
复杂界面设计:
- 在复杂的界面设计中,可能需要子组件在交叉轴上进行不同的对齐方式,比如某些组件居中对齐,而其他组件需要左对齐或右对齐。
文本对齐:
- 使用 `CrossAxisAlignment.baseline` 可以确保在 `Row` 中包含文本的小部件基于文本的基线对齐,这在处理多行文本或混合文本和图标时特别有用。
注意事项
`CrossAxisAlignment.baseline` 的限制:
- 只能在 `Row` 中使用,因为 `Column` 没有基线概念。使用时确保所有子组件都有文本基线,否则可能会引发布局错误。
`CrossAxisAlignment.stretch` 的使用:
- 适用于希望子组件填充整个交叉轴可用空间的情况。确保子组件没有指定固定的宽度(在 `Column` 中)或高度(在 `Row` 中),否则拉伸效果将无法生效。
与 `MainAxisAlignment` 的组合:
- `CrossAxisAlignment` 通常与 `MainAxisAlignment` 一起使用,以全面控制 `Row` 或 `Column` 的子组件在两个轴上的对齐方式。
影响布局性能:
- 在非常复杂的布局中,频繁调整 `CrossAxisAlignment` 和 `MainAxisAlignment` 可能会对性能产生一定影响,尤其是在构建大型或动态界面时。
通过合理使用 `CrossAxisAlignment`,开发者可以实现灵活且符合设计规范的用户界面布局,确保应用在各种设备和屏幕尺寸上都能提供良好的用户体验。
MainAxisAlignment
`MainAxisAlignment` 是 Flutter 中用于控制布局子组件在主轴(main axis)方向上的对齐方式的一个枚举类。它主要在 `Flex` 布局模型中使用,比如 `Row` 和 `Column` 这两个常用的小部件。
基本概念
在 Flutter 的布局系统中,`Row` 和 `Column` 使用的是 `Flex` 布局模型:
- 主轴(Main Axis):在 `Row` 中是水平方向,在 `Column` 中是垂直方向。
- 交叉轴(Cross Axis):在 `Row` 中是垂直方向,在 `Column` 中是水平方向。
`MainAxisAlignment` 控制子组件在主轴方向上的对齐方式。
`MainAxisAlignment` 枚举值
`MainAxisAlignment.start`:
- 子组件在主轴的起始位置对齐。
- 在 `Row` 中,这意味着子组件会从左到右排列;在 `Column` 中,子组件会从上到下排列。
`MainAxisAlignment.end`:
- 子组件在主轴的结束位置对齐。
- 在 `Row` 中,这意味着子组件会从右到左排列;在 `Column` 中,子组件会从下到上排列。
`MainAxisAlignment.center`:
- 子组件在主轴上居中对齐。
- `MainAxisAlignment.spaceBetween`:
- 子组件在主轴上均匀分布,第一个子组件靠在起始位置,最后一个子组件靠在结束位置,中间的子组件之间有相等的间隔。
`MainAxisAlignment.spaceAround`:
- 子组件在主轴上均匀分布,每个子组件周围都有相等的间隔。第一个和最后一个子组件与起始和结束位置之间的间隔是中间子组件间隔的一半。
`MainAxisAlignment.spaceEvenly`:
- 子组件在主轴上均匀分布,每个子组件之间的间隔相等,包括第一个和最后一个子组件与起始和结束位置之间的间隔。
使用示例
下面是一个使用 `MainAxisAlignment` 的简单示例:
import 'package:flutter/material.dart';class MainAxisAlignmentExample extends StatelessWidget {const MainAxisAlignmentExample({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("MainAxisAlignment Example")),body: Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[Container(color: Colors.redAccent,height: 50,width: 100,child: const Center(child: Text('Box 1'),),),Container(color: Colors.green,height: 50,width: 100,child: const Center(child: Text('Box 2')),),Container(color: Colors.blue,height: 50,width: 100,child: const Center(child: Text('Box 3')),),],),);}
}
在上述示例中,我们使用了 `MainAxisAlignment.spaceEvenly` 来确保 `Column` 中的每个 `Container` 在垂直方向上都有相等的间隔。这种布局方式在设计中非常有用,尤其是在需要保持布局对称时。
适用场景
响应式布局:
- 在响应式设计中,`MainAxisAlignment` 可以帮助在不同屏幕尺寸上保持一致的布局和间距。
对称设计:
- 使用 `spaceBetween`、`spaceAround`、和 `spaceEvenly` 等选项,可以轻松创建对称且美观的界面。
动态内容:
- 当内容数量不固定时,通过 `MainAxisAlignment` 可以确保内容在父容器中合理分布,无需手动调整每个元素的位置。
按钮和图标布局:
- 在工具栏或包含多个按钮的布局中,使用 `MainAxisAlignment` 可以确保按钮之间保持一致的间距。
注意事项
布局方向:
- `MainAxisAlignment` 的效果取决于 `Flex` 布局的方向(`Row` 或 `Column`),因此在使用时要明确布局的主轴方向。
空间分配:
- `spaceBetween`、`spaceAround`、和 `spaceEvenly` 这些选项会根据父容器的大小动态调整子组件之间的间距,因此在父容器尺寸变化时,子组件之间的间距也会相应调整。
与其他属性结合使用:
- 在实际布局中,`MainAxisAlignment` 通常与 `CrossAxisAlignment` 和 `MainAxisSize` 等属性一起使用,以实现更复杂的布局效果。
通过合理应用 `MainAxisAlignment`,开发者可以更灵活地控制子组件在主轴方向上的排列方式,创造出精致且响应良好的用户界面。
MainAxisSize
`MainAxisSize` 是 Flutter 中用于确定 `Flex` 布局模型(例如 `Row` 和 `Column`)在主轴方向上占用空间的策略。它定义了主轴尺寸是由子组件的大小决定还是由父容器的大小决定。
基本概念
在 Flutter 中,`Row` 和 `Column` 使用的都是 `Flex` 布局模型。`MainAxisSize` 控制这些布局在主轴方向上应该占据父容器的多大空间。
`MainAxisSize` 枚举值
`MainAxisSize.min`:
- 布局在主轴方向上将尽可能小,只占用子组件所需的最小空间。
- 例如,在 `Column` 中,如果使用 `MainAxisSize.min`,则 `Column` 的高度将等于其所有子组件的总高度,而不会扩展到填满父容器。
`MainAxisSize.max`:
- 布局在主轴方向上将尽可能大,占满父容器的可用空间。
- 例如,在 `Row` 中,如果使用 `MainAxisSize.max`,则 `Row` 的宽度将扩展以填满父容器,即使子组件的总宽度不足以填满。
使用示例
import 'package:flutter/material.dart';class MainAxisSizeExample extends StatelessWidget{const MainAxisSizeExample({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("MainAxisSize Example")),body: Column(mainAxisSize: MainAxisSize.min, // Set the main axis size to minimumchildren: <Widget>[Container(color: Colors.red,height: 50,width: double.infinity,child: const Center(child: Text('Box 1')),),Container(color: Colors.green,height: 50,width: double.infinity,child: const Center(child: Text('Box 2')),),Container(color: Colors.blue,height: 50,width: double.infinity,child: const Center(child: Text('Box 3')),),],));}}
解释
`Column` 小部件:
- 设置 `mainAxisSize: MainAxisSize.min`,这使得 `Column` 的高度只等于其子组件总高度,而不是扩展到填满屏幕的高度。
效果:
- 在这个例子中,`Column` 只占用了三个 `Container` 的总高度,即 150 像素,而不是填满整个屏幕的可用高度。
适用场景
自适应布局:
- 在需要根据子组件内容动态调整布局大小时,`MainAxisSize.min` 可以确保布局不会占用多余的空间。
固定布局:
- 使用 `MainAxisSize.max` 可以确保布局占用所有可用空间,这对于需要固定填满父容器的布局非常有用。
灵活设计:
- 根据设计需求,选择适当的 `MainAxisSize` 值可以帮助实现灵活且响应良好的界面。
Column
`Column` 是 Flutter 中一个常用的小部件,用于在垂直方向上排列其子组件。它属于 `Flex` 布局模型的一部分,与 `Row`(水平排列子组件)类似,但在垂直方向上工作。
基本概念
`Column` 小部件会自动根据其子组件的大小和父容器的约束来调整自身的高度。它提供了多种属性,以灵活地控制子组件的排列方式和布局行为。
主要属性
`children`:
- 一个子组件列表,决定了 `Column` 中的内容。
- 每个子组件都按顺序从上到下排列。
`mainAxisAlignment`:
- 控制子组件在主轴(垂直方向)上的对齐方式。
- 可以使用 `MainAxisAlignment` 枚举值,如 `start`、`end`、`center`、`spaceBetween`、`spaceAround`、`spaceEvenly`。
`crossAxisAlignment`:
- 控制子组件在交叉轴(水平方向)上的对齐方式。
- 可以使用 `CrossAxisAlignment` 枚举值,如 `start`、`end`、`center`、`stretch`、`baseline`。
`mainAxisSize`:
- 控制 `Column` 在主轴上的大小。
- 使用 `MainAxisSize` 枚举值,如 `min`(根据子组件大小)和 `max`(根据父容器大小)。
`verticalDirection`:
- 指定子组件的布局方向,是从上到下还是从下到上。
- 使用 `VerticalDirection` 枚举值,如 `down`(默认)和 `up`。
`textDirection`:
- 控制子组件的文本方向,尤其在使用 `CrossAxisAlignment.start` 和 `CrossAxisAlignment.end` 时很有用。
- 使用 `TextDirection` 枚举值,如 `ltr`(从左到右)和 `rtl`(从右到左)。
使用示例
import 'package:flutter/material.dart';class ColumnExample extends StatelessWidget {const ColumnExample({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("Column Example")),body: Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly,crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[Container(color: Colors.red,height: 50,width: 100,child: const Center(child: Text('Box 1')),),Container(color: Colors.green,height: 50,width: 100,child: const Center(child: Text('Box 2')),),Container(color: Colors.blue,height: 50,width: 100,child: const Center(child: Text('Box 3')),),],),);}
}
解释
`mainAxisAlignment: MainAxisAlignment.spaceEvenly`:
- 使得 `Column` 中的子组件在垂直方向上均匀分布,每个子组件之间的间隔相等。
`crossAxisAlignment: CrossAxisAlignment.center`:
- 使得 `Column` 中的子组件在水平方向上居中对齐。
Expanded
`Expanded` 是 Flutter 中的一个布局小部件,用于在 `Flex` 布局(如 `Row`、`Column`、`Flex`)中扩展子组件,以填充主轴上剩余的可用空间。它与 `Flexible` 小部件紧密相关,但提供了一种更简便的方式来分配剩余空间。
基本概念
`Expanded` 小部件会将子组件包裹起来,并指示 `Flex` 布局将主轴上剩余的空间分配给此组件。它通常与其他 `Expanded` 或 `Flexible` 小部件一起使用,以按比例分配可用空间。
主要属性
`child`:
- 需要扩展以填充可用空间的子组件。
`flex`:
- 一个整数值,表示如何分配可用空间。
- 默认为 `1`,可以设置为其他值以指定不同的空间分配比率。
使用示例
以下是一个简单的例子,展示了如何在 `Row` 中使用 `Expanded` 小部件:
import 'package:flutter/material.dart';class ExpandedExample extends StatelessWidget {const ExpandedExample({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("Expanded Example")),body: Row(children: <Widget>[Container(color: Colors.red,width: 100,child: const Center(child: Text('Fixed Width')),),Expanded(child: Container(color: Colors.greenAccent,child: const Center(child: Text('Expanded')),)),Expanded(flex: 2,child: Container(color: Colors.blue,child: const Center(child: Text('Expanded Flex 2')),))],),);}
}
解释
- 固定宽度容器:
- 第一个 `Container` 具有固定宽度 100 像素,并且颜色为红色。
- `Expanded` 容器:
- 第二个 `Container` 被 `Expanded` 包裹,因此它将扩展以填充 `Row` 中剩余的可用空间。
- 第三个 `Container` 也被 `Expanded` 包裹,并设置了 `flex: 2`,意味着它将占用两倍于第二个 `Expanded` 容器的空间。
适用场景
动态布局:
- 在需要根据可用空间动态调整子组件大小时,使用 `Expanded` 可以确保界面在不同设备上都能很好地适应。
比例布局:
- 通过设置不同的 `flex` 值,可以轻松实现子组件按比例分配可用空间的效果。
响应式设计:
- 在响应式设计中,`Expanded` 可以帮助在不同屏幕尺寸上保持布局的一致性和美观。
注意事项
只在 `Flex` 布局中使用:
- `Expanded` 只能用在 `Row`、`Column` 或 `Flex` 小部件的子组件中,因为这些布局才有主轴的概念。
与 `Flexible` 的区别:
- `Expanded` 是 `Flexible` 的一种特例,`fit` 属性自动设置为 `FlexFit.tight`,表示必须填充所有可用空间。
结合三方库实现ViewPager学习
在pubspec.yaml文件中配置依赖项
dependencies:flutter:sdk: flutteranother_transformer_page_view: 2.0.0
这段代码是 Flutter 项目的 `pubspec.yaml` 文件中 `dependencies` 部分的一个典型示例。`dependencies` 部分用于列出项目所依赖的包和库。让我们逐行解析这段配置:
`dependencies:`:
- 这行标识依赖项的开始。在这个部分中,列出了项目的所有直接依赖关系。
`flutter:`:
- 指定项目依赖于 Flutter SDK。Flutter 是一个用于构建跨平台应用的框架。
`sdk: flutter`:
- 表明这个依赖项是 Flutter SDK 本身。
`another_transformer_page_view: 2.0.0`:
- 指定项目依赖于 `another_transformer_page_view` 包的版本 `2.0.0`。这个包用于实现增强的页面视图效果,如自定义的页面切换动画。
解释
版本号:
- 直接指定版本号(如 `3.0.1` 和 `2.0.0`)表示项目需要这些特定版本的包。这确保了项目的依赖在不同环境中是一致的。
注释:
- 注释用于解释代码或临时禁用某些配置。这里的注释告诉开发者 `cupertino_icons` 的用途以及它的版本要求。
依赖管理:
- `pubspec.yaml` 文件是 Dart 和 Flutter 项目中管理依赖的核心文件。它允许开发者轻松添加、更新或移除项目的外部依赖。
兼容性:
- 通过明确版本号和使用版本范围符号,开发者可以控制项目依赖的兼容性,避免由于包更新导致的潜在问题。
在`pubspec.lock` 文件中配置依赖项
描述了一个名为 `another_transformer_page_view` 的 Dart 包的依赖配置。`pubspec.lock` 文件用于管理 Flutter 和 Dart 项目的包依赖,以及项目的其他元数据。
another_transformer_page_view:dependency: "direct main"description:name: another_transformer_page_viewsha256: "0b06f2564a7e38c3277a01b28cf10a9c457c52dfa01ef4ff8853986131db1b95"url: "https://pub.dev"source: hostedversion: "2.0.0"
让我们逐行解析这段配置:
`another_transformer_page_view:`:
- 这是包的名称,表示项目依赖于这个包。
`dependency: "direct main"`:
- 这行表示包的依赖类型为 "direct main"。在 Flutter 和 Dart 项目中,依赖可以是直接的(项目代码中直接引用的)或间接的(通过其他包引入的),"main" 表示这是一个主要依赖项。
`description:`:
- 这部分提供了有关包的详细信息。
`name: another_transformer_page_view`:
- 这是包的名称,与第一行一致。
`sha256: "0b06f2564a7e38c3277a01b28cf10a9c457c52dfa01ef4ff8853986131db1b95"`:
- 这是包的 SHA-256 校验和。它用于验证下载的包的完整性和来源的真实性,确保包未被篡改。
`url: "
https://pub.dev
"`:
- 这是包的来源网址。`
https://pub.dev
` 是 Dart 和 Flutter 包的官方存储库网站,开发者可以在这里查找和发布包。
`source: hosted`:
- 指定包的来源方式为 "hosted",表示包托管在一个公共的或私有的包存储库中。在这种情况下,包托管在 `pub.dev` 上。
`version: "2.0.0"`:
- 指定项目依赖的 `another_transformer_page_view` 包的版本号为 `2.0.0`。项目将安装并使用这个版本的包。
解释
依赖管理:
- `pubspec.yaml` 文件用来定义项目的依赖项,确保所有开发人员在同一个版本上进行开发,并且项目在不同机器上有相同的运行环境。
包版本:
- 明确指定版本号可以避免由于包更新导致的意外行为变化。开发者可以通过这种方式保持依赖的稳定性。
完整性验证:
- 使用 SHA-256 校验和可以在下载包时验证其完整性,防止数据被篡改。
这种配置方式帮助开发者有效管理项目中的外部依赖,确保项目的一致性和可维护性。
TransformerPageView
`TransformerPageView` 是一个来自 Flutter 的 `another_transformer_page_view` 包中的小部件,它扩展了标准的 `PageView`,提供了丰富的页面切换动画效果。这个小部件允许开发者在页面之间切换时应用自定义的动画转换效果,从而增强用户体验。
核心概念
`TransformerPageView` 使用 `PageTransformer` 来定义页面切换时的动画效果。开发者可以使用内置的转换器,或者创建自定义的 `PageTransformer`,以实现独特的动画效果。
主要属性
`itemCount`:
- 页面视图中的页面总数。
`itemBuilder`:
- 一个函数,用于根据索引构建每个页面的内容。
`transformer`:
- 用于定义页面切换动画效果的 `PageTransformer` 实例。开发者可以使用预定义的转换器或创建自定义转换器。
`loop`:
- 一个布尔值,指示页面视图是否应该循环滚动。当设置为 `true` 时,用户可以无限滚动页面。
`controller`:
- 一个 `PageController` 实例,用于控制页面视图的行为,如当前页码、跳转页码等。
`onPageChanged`:
- 一个回调函数,在页面改变时触发,提供当前页面的索引。
使用示例
以下是一个简单的示例,展示如何在 Flutter 中使用 `TransformerPageView`:
import 'package:flutter/material.dart';
import 'package:another_transformer_page_view/another_transformer_page_view.dart';
import 'dart:math' as Math;class MyPageView extends StatelessWidget {const MyPageView({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Transformer Page View')),body: TransformerPageView(loop: true,transformer: ZoomOutPageTransformer(), // 使用预定义的转换器itemCount: 3,itemBuilder: (context, index) {return Container(color: index.isEven ? Colors.blue : Colors.green,child: Center(child: Text('Page $index',style: const TextStyle(fontSize: 32, color: Colors.white),),),);},),);}
}class ZoomOutPageTransformer extends PageTransformer {static const double MIN_SCALE = 0.85;static const double MIN_ALPHA = 0.5;@overrideWidget transform(Widget child, TransformInfo info) {double position = info.position!;double? pageWidth = info.width;double? pageHeight = info.height;if (position < -1) {// [-Infinity,-1)// This page is way off-screen to the left.//view.setAlpha(0);} else if (position <= 1) {// [-1,1]// Modify the default slide transition to// shrink the page as welldouble scaleFactor = Math.max(MIN_SCALE, 1 - position.abs());double vertMargin = pageHeight! * (1 - scaleFactor) / 2;double horzMargin = pageWidth! * (1 - scaleFactor) / 2;double dx;if (position < 0) {dx = (horzMargin - vertMargin / 2);} else {dx = (-horzMargin + vertMargin / 2);}// Scale the page down (between MIN_SCALE and 1)double opacity = MIN_ALPHA +(scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA);return Opacity(opacity: opacity,child: Transform.translate(offset: Offset(dx, 0.0),child: Transform.scale(scale: scaleFactor,child: child,),),);} else {// (1,+Infinity]// This page is way off-screen to the right.// view.setAlpha(0);}return child;}
}
解释
`TransformerPageView`:
- 替代标准 `PageView` 的组件,用于实现具有动画转换效果的页面切换。
`ZoomOutPageTransformer`:
- 一个内置的转换器,应用缩放和淡出效果。可以替换为其他内置转换器或自定义转换器。
`loop: true`:
- 使页面视图循环滚动,用户可以无限地往前或往后滚动页面。
IndexController
`IndexController` 是 `another_transformer_page_view` 包中的一个工具类,用于控制 `TransformerPageView` 的行为,类似于 Flutter 的 `PageController`。它提供了对页面视图进行编程控制的能力,如跳转到特定页面、获取当前页面索引等。
核心功能
`IndexController` 提供了一些方法和属性,帮助开发者更灵活地控制 `TransformerPageView`。以下是一些常用的功能:
跳转到特定页面:
- 可以通过方法直接跳转到指定的页面。
获取当前页面索引:
- 可以随时获取或监听当前显示页面的索引。
页面视图的动态控制:
- 可以在用户交互之外,通过编程方式动态控制页面的切换。
常用方法和属性
`animateToPage`:
- 动画方式跳转到指定页面。
- 通常需要提供目标页码、动画持续时间和动画曲线。
`jumpToPage`:
- 立即跳转到指定页面,没有动画效果。
`currentIndex`:
- 获取或设置当前页面的索引。
`previousPage` 和 `nextPage`:
- 这些方法用于跳转到上一页或下一页。
使用示例
假设你有一个需要控制 `TransformerPageView` 的 Flutter 项目,下面是一个简单的示例:
import 'package:another_transformer_page_view/another_transformer_page_view.dart';
import 'package:flutter/material.dart';
import 'dart:math' as Math;class MyPageViewDemo2222 extends StatefulWidget {const MyPageViewDemo2222({super.key});@overrideState<StatefulWidget> createState() {return _MyPageViewState2222();}
}class _MyPageViewState2222 extends State<MyPageViewDemo2222> {final IndexController controller = IndexController();@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Index Controller Example')),body: Column(children: [Expanded(child: TransformerPageView(loop: false,itemCount: 5,controller: controller,transformer: ZoomOutPageTransformer(),itemBuilder: (context, index) {return Container(color: Colors.accents[index % Colors.accents.length],child: Center(child: Text('Page $index',style: const TextStyle(fontSize: 32, color: Colors.white),),),);},)),Row(mainAxisAlignment: MainAxisAlignment.center,children: [ElevatedButton(onPressed: () => controller.previous(),child: const Text('Previous')),ElevatedButton(onPressed: () => controller.next(), child: const Text('Next'))],)],),);}
}class ZoomOutPageTransformer extends PageTransformer {static const double MIN_SCALE = 0.85;static const double MIN_ALPHA = 0.5;@overrideWidget transform(Widget child, TransformInfo info) {double position = info.position!;double? pageWidth = info.width;double? pageHeight = info.height;if (position < -1) {// [-Infinity,-1)// This page is way off-screen to the left.//view.setAlpha(0);} else if (position <= 1) {// [-1,1]// Modify the default slide transition to// shrink the page as welldouble scaleFactor = Math.max(MIN_SCALE, 1 - position.abs());double vertMargin = pageHeight! * (1 - scaleFactor) / 2;double horzMargin = pageWidth! * (1 - scaleFactor) / 2;double dx;if (position < 0) {dx = (horzMargin - vertMargin / 2);} else {dx = (-horzMargin + vertMargin / 2);}// Scale the page down (between MIN_SCALE and 1)double opacity = MIN_ALPHA +(scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA);return Opacity(opacity: opacity,child: Transform.translate(offset: Offset(dx, 0.0),child: Transform.scale(scale: scaleFactor,child: child,),),);} else {// (1,+Infinity]// This page is way off-screen to the right.// view.setAlpha(0);}return child;}
}
解释
`IndexController` 实例化:
- 我们创建了一个 `IndexController` 实例,用于控制 `TransformerPageView`。
`TransformerPageView` 的 `controller` 属性:
- 通过将 `controller` 传递给 `TransformerPageView`,我们可以使用 `IndexController` 的方法来控制页面切换。
按钮控制:
- 使用 `previousPage` 和 `nextPage` 方法,通过按钮点击来控制页面的切换。
PageTransformer
`PageTransformer` 是 `another_transformer_page_view` 包中的一个核心概念,用于定义页面切换时的动画效果。在使用 `TransformerPageView` 时,`PageTransformer` 允许开发者为页面切换创建自定义的动画,从而增强用户体验。
基本概念
自定义动画效果:
- `PageTransformer` 是一个抽象类,需要实现其方法来定义特定的动画效果。通过它,你可以控制每个页面在切换过程中的外观变化,例如位置、缩放、透明度等。
灵活性:
- 通过实现 `PageTransformer`,开发者可以在页面切换时实现各种复杂的动画效果,而不仅仅局限于简单的位移。
主要组件
`transform` 方法:
- 这是 `PageTransformer` 的核心方法,开发者需要实现这个方法来定义页面切换时的动画效果。
- `transform` 方法通常接收当前页面的 `Widget` 和 `TransformInfo`,后者提供关于页面位置和其他状态的信息。
`TransformInfo`:
- 这个对象包含有关页面在切换过程中的状态信息,例如页面的相对位置、页面索引等。
示例
以下是一个简单的自定义 `PageTransformer` 示例,它在页面切换时对页面进行缩放和透明度变化:
import 'package:another_transformer_page_view/another_transformer_page_view.dart';
import 'package:flutter/material.dart';class CustomPageTransformer extends PageTransformer {@overrideWidget transform(Widget child, TransformInfo info) {// 获取页面的位置,通常在 -1 到 1 之间double position = info.position!;// 计算透明度,确保在 0 到 1 之间double opacity = (1 - position.abs()).clamp(0.0, 1.0);// 计算缩放因子double scale = 1 - (0.2 * position.abs());// 返回经过处理的页面组件return Opacity(opacity: opacity,child: Transform.scale(scale: scale,child: child,),);}
}class MyCustomPageView extends StatelessWidget {const MyCustomPageView({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Custom Page Transformer')),body: TransformerPageView(itemCount: 5,transformer: CustomPageTransformer(),loop: true,itemBuilder: (context, index) {return Container(color: Colors.accents[index % Colors.accents.length],child: Center(child: Text('Page $index',style: const TextStyle(fontSize: 32, color: Colors.white),),),);},),);}
}
解释
`CustomPageTransformer`:
- 继承自 `PageTransformer`,实现了 `transform` 方法。
- 通过调整透明度和缩放比例,定义了一个简单的缩放和淡出动画。
`position`:
- 反映页面的相对位置。通常,页面在视图中间时 `position` 为 0,左侧为负,右侧为正。
`opacity` 和 `scale`:
- 使用这两个属性来动态调整页面在切换时的透明度和缩放效果
三方库another_transformer_page_view
`another_transformer_page_view` 是 Flutter 的一个第三方包,提供了增强的页面视图功能,特别是丰富多样的页面切换动画效果。这个包可以用来创建具有吸引力的用户界面,尤其是在实现应用的引导页、图像幻灯片或其他需要视觉切换效果的场景中。
功能和特点
自定义页面切换动画:
- 提供了多种预定义的页面切换效果,比如旋转、缩放、淡入淡出等。
- 开发者可以基于现有效果创建自定义动画,从而更好地满足特定的设计需求。
与 `PageView` 类似的 API:
- `another_transformer_page_view` 的使用方式与 Flutter 自带的 `PageView` 类似,因此对开发者来说很容易上手。
- 支持无限循环滚动、页面指示器等常见的页面视图功能。
高度可定制:
- 可以通过实现 `PageTransformer` 来创建自定义的页面转换效果。
- 提供灵活的布局和动画选项,使其适用于多种设计风格。
使用示例
假设你有一个需要使用 `another_transformer_page_view` 的 Flutter 项目,下面是一个简单的使用示例:
import 'package:another_transformer_page_view/another_transformer_page_view.dart';
import 'package:flutter/material.dart';
import 'package:gsy_flutter_demo/widget/viewpager_demo_page.dart';
import 'dart:math' as Math;class MyPageView extends StatelessWidget {const MyPageView({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Transformer Page View')),body: TransformerPageView(loop: true,transformer: ZoomOutPageTransformer(),itemCount: 3,itemBuilder: (context, index) {return Container(color: index.isEven ? Colors.blue : Colors.green,child: Center(child: Text('Page $index',style: const TextStyle(fontSize: 32, color: Colors.white),),),);},),);}
}class ZoomOutPageTransformer extends PageTransformer {static const double MIN_SCALE = 0.85;static const double MIN_ALPHA = 0.5;@overrideWidget transform(Widget child, TransformInfo info) {double position = info.position!;double? pageWidth = info.width;double? pageHeight = info.height;if (position < -1) {// [-Infinity,-1)// This page is way off-screen to the left.//view.setAlpha(0);} else if (position <= 1) {// [-1,1]// Modify the default slide transition to// shrink the page as welldouble scaleFactor = Math.max(MIN_SCALE, 1 - position.abs());double vertMargin = pageHeight! * (1 - scaleFactor) / 2;double horzMargin = pageWidth! * (1 - scaleFactor) / 2;double dx;if (position < 0) {dx = (horzMargin - vertMargin / 2);} else {dx = (-horzMargin + vertMargin / 2);}// Scale the page down (between MIN_SCALE and 1)double opacity = MIN_ALPHA +(scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA);return Opacity(opacity: opacity,child: Transform.translate(offset: Offset(dx, 0.0),child: Transform.scale(scale: scaleFactor,child: child,),),);} else {// (1,+Infinity]// This page is way off-screen to the right.// view.setAlpha(0);}return child;}
}
解释
- `TransformerPageView`:
- 这是 `another_transformer_page_view` 的核心组件,类似于 Flutter 的 `PageView`。
- `loop: true` 表示页面视图是循环的,用户可以无限滚动。
- `transformer: ZoomOutPageTransformer()` 设置了页面切换时使用的动画效果。
- `itemBuilder`:
- 用于构建每个页面的内容。在这个例子中,不同索引的页面有不同的背景颜色。
适用场景
应用引导页:
- 可用于创建应用的引导页,提供视觉上吸引人的切换效果。
图片轮播:
- 在需要展示一系列图片或内容的情况下,这个包提供了丰富的切换效果,使内容展示更具吸引力。
幻灯片展示:
- 用于制作幻灯片或展示文档的应用,提供了灵活的动画效果。
注意事项
性能:
- 由于动画效果可能涉及复杂的图形计算,在低性能设备上可能需要注意优化。
兼容性:
- 在使用自定义动画效果时,确保其与应用的整体设计风格一致,以提供最佳的用户体验。
TransformInfo
`TransformInfo` 是 `another_transformer_page_view` 包中的一个类,用于提供在 `PageTransformer` 的 `transform` 方法中使用的关键信息。这个类封装了页面在切换过程中的一些状态信息,帮助开发者在实现自定义动画时更精确地控制页面的外观和行为。
主要属性
以下是 `TransformInfo` 类的几个主要属性,它们通常可用于在 `transform` 方法中实现自定义动画:
`position`:
- 这是一个 `double` 类型的属性,表示当前页面相对于视图中心的位置。
- `position` 为 0 时,页面正好在视图的中心。
- 负值表示页面在视图的左侧,正值表示页面在视图的右侧。
- 这个值通常在 -1 到 1 之间变化,但在快速滑动时可能会超出这个范围。
`index`:
- 当前页面的索引值。
- 这是一个整数,表示页面在 `TransformerPageView` 中的顺序。
`activeIndex`:
- 当前活动页面的索引。
- 表示当前视图中完全可见的页面的索引。
`viewportFraction`:
- 视图窗口的比例,通常用于计算页面在视图中的显示比例。
- 这可以帮助在自定义动画中调整页面的大小或位置。
`width` 和 `height`:
- 当前视图的宽度和高度。
- 在实现动画时,可以根据这些值来调整页面的大小或位置。
使用示例
在实现自定义的 `PageTransformer` 时,`TransformInfo` 提供了丰富的信息,使动画效果更为灵活和精确。以下是一个简单示例,展示如何使用 `TransformInfo` 来创建动画效果:
import 'package:flutter/material.dart';
import 'package:another_transformer_page_view/another_transformer_page_view.dart';
class CustomPageTransformer extends PageTransformer {@overrideWidget transform(Widget child, TransformInfo info) {// 使用 position 确定页面的位置double position = info.position;// 计算透明度和缩放因子double opacity = (1 - position.abs()).clamp(0.0, 1.0);double scale = 1 - (0.2 * position.abs());// 返回经过处理的页面组件return Opacity(opacity: opacity,child: Transform.scale(scale: scale,child: child,),);}
}
解释
`position`:
- 用于确定页面在切换过程中的相对位置。根据它,可以实现不同的动画效果,如淡入淡出、缩放等。
`index` 和 `activeIndex`:
- 可以用于实现基于页面索引的特定动画效果。例如,突出显示当前活动页面。
`viewportFraction`:
- 在需要调整页面显示比例时使用,通常用于创建更复杂的动画效果。
应用场景
精确控制:
- 通过使用 `TransformInfo` 中的属性,开发者可以实现对页面切换过程的精确控制和定制。
复杂动画:
- 提供了实现复杂和动态动画效果所需的关键数据,使页面切换更加生动和吸引人。
another_transformer_page_view实现ViewPager代码学习
import 'dart:math' as Math;
import 'package:another_transformer_page_view/another_transformer_page_view.dart';
import 'package:flutter/material.dart';
import 'package:vector_math/vector_math_64.dart' as vector;class ViewPagerDemoPage extends StatelessWidget {final List<Color> colorList = [Colors.redAccent,Colors.blueAccent,Colors.greenAccent];ViewPagerDemoPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(backgroundColor: Theme.of(context).primaryColorDark,appBar: AppBar(title: const Text("ViewPagerDemoPage"),),body: Container(alignment: Alignment.topCenter,child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,mainAxisSize: MainAxisSize.max,children: <Widget>[Expanded(child: TransformerPageView(loop: false,controller: IndexController(),itemBuilder: (BuildContext context, int index) {return Container(decoration: BoxDecoration(color: colorList[index % colorList.length],border: Border.all(color: Colors.white)),child: Center(child: Text("$index",style: const TextStyle(fontSize: 80.0, color: Colors.white),),),);},itemCount: 3),),Expanded(child: TransformerPageView(loop: true,controller: IndexController(),transformer: AccordionTransformer(),itemBuilder: (BuildContext context, int index) {return Container(decoration: BoxDecoration(color: colorList[index % colorList.length],border: Border.all(color: Colors.white)),child: Center(child: Text("$index",style: const TextStyle(fontSize: 80.0, color: Colors.white),),),);},itemCount: 3),),Expanded(child: TransformerPageView(loop: true,controller: IndexController(),transformer: ThreeDTransformer(),itemBuilder: (BuildContext context, int index) {return Container(decoration: BoxDecoration(color: colorList[index % colorList.length],border: Border.all(color: Colors.white)),child: Center(child: Text("$index",style: const TextStyle(fontSize: 80.0, color: Colors.white),),),);},itemCount: 3),),Expanded(child: TransformerPageView(loop: true,controller: IndexController(),transformer: DeepthPageTransformer(),itemBuilder: (BuildContext context, int index) {return Container(decoration: BoxDecoration(color: colorList[index % colorList.length],border: Border.all(color: Colors.white)),child: Center(child: Text("$index",style: const TextStyle(fontSize: 80.0, color: Colors.white),),),);},itemCount: 3),),],),),);}
}class AccordionTransformer extends PageTransformer {@overrideWidget transform(Widget child, TransformInfo info) {double position = info.position!;if (position < 0.0) {return Transform.scale(scale: 1 + position,alignment: Alignment.topRight,child: child,);} else {return Transform.scale(scale: 1 - position,alignment: Alignment.bottomLeft,child: child,);}}
}class ThreeDTransformer extends PageTransformer {@overrideWidget transform(Widget child, TransformInfo info) {double position = info.position!;double height = info.height!;double? width = info.width;double? pivotX = 0.0;if (position < 0 && position >= -1) {// left scrollingpivotX = width;}return Transform(transform: Matrix4.identity()..rotate(vector.Vector3(0.0, 2.0, 0.0), position * 1.5),origin: Offset(pivotX!, height / 2),child: child,);}
}class DeepthPageTransformer extends PageTransformer {DeepthPageTransformer() : super(reverse: true);@overrideWidget transform(Widget child, TransformInfo info) {double position = info.position!;if (position <= 0) {return Opacity(opacity: 1.0,child: Transform.translate(offset: const Offset(0.0, 0.0),child: Transform.scale(scale: 1.0,child: child,),),);} else if (position <= 1) {const double minScale = 0.75;// Scale the page down (between MIN_SCALE and 1)double scaleFactor = minScale + (1 - minScale) * (1 - position);return Opacity(opacity: 1.0 - position,child: Transform.translate(offset: Offset(info.width! * -position, 0.0),child: Transform.scale(scale: scaleFactor,child: child,),),);}return child;}
}
相关文章:
Flutter封装一个三方ViewPager学习
Flutter如何实现一个增强的 PageView,支持自定义页面切换动画。 前置知识点学习 CrossAxisAlignment CrossAxisAlignment 是 Flutter 中用于控制布局子组件在交叉轴(cross axis)方向上的对齐方式的一个枚举类。它主要在 Flex 布局模型中使…...

服务器数据恢复—离线盘数超过热备盘数导致raidz阵列崩溃的数据恢复
服务器数据恢复环境&故障: 一台配有32块硬盘的服务器在运行过程中突然崩溃不可用。经过初步检测,基本上确定服务器硬件不存在物理故障。管理员重启服务器后问题依旧。需要恢复该服务器中的数据。 服务器数据恢复环境: 1、将服务器中硬盘…...
nginx-nginx的缓存集成
缓存的概念 缓存就是数据交换的缓冲区,被称作cache,访用户想要获取数据时,就会先从缓存中去查询数据,如果缓存中有就会直接返回给用户,若果缓存中没有,则会发出请求从服务器中重新查询数据,将数…...

【Vim Masterclass 笔记01】Section 1:Course Overview + Section 2:Vim Quickstart
文章目录 Section 1:Course Introduction 课程概述S01L01 Course Overview 课程简介课程概要 S01L02 Course Download 课程资源下载S01L03 What Vim Is and Why You Should Learn It 何为 Vim?学来干啥?1 何为 Vim2 为何学 Vim Section 2&…...

【数据库系列】Spring Boot 中使用 MyBatis 详细指南
一、基础介绍 1.1 MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 P…...

Azure Airflow 中配置错误可能会使整个集群受到攻击
网络安全研究人员在 Microsoft 的 Azure 数据工厂 Apache Airflow 中发现了三个安全漏洞,如果成功利用这些漏洞,攻击者可能会获得执行各种隐蔽操作的能力,包括数据泄露和恶意软件部署。 “利用这些漏洞可能允许攻击者以影子管理员的身份获得…...

Python跨年烟花
目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…...
【代码】Python|Windows 批量尝试密码去打开加密的 Word 文档(docx和doc)
文章目录 前言完整代码Githubdocxdoc 代码解释1. msoffcrypto 方法(用于解密 .docx 文件)read_secret_word_file 函数密码生成与解密尝试try_decrypt_file 函数 2. comtypes 方法(用于解密 .doc 文件)read_secret_word_file 函数注…...
java开发中注解汇总
注解作用位置注意mybatis Data Getter Setter ToString EqualsAndHashCode AllArgsConstructor NoArgsConstructor Data 代替:无参构造,get,set,toString,hashCode,equals Getter Setter 可放在类和方法上&…...
C# 设计模式(结构型模式):外观模式
C# 设计模式(结构型模式):外观模式 (Facade Pattern) 在复杂系统中,往往会涉及到多个子系统、模块和类。这些子系统的接口和功能可能会让使用者感到困惑和复杂。在这种情况下,我们可以使用外观模式(Facade…...

PowerShell 常见问题解答
PowerShell 是微软开发的一种功能强大的命令行界面和脚本语言,广泛应用于系统管理和自动化任务。以下是一些使用 PowerShell 时常见的问题及其解决方法。 什么是 PowerShell? PowerShell 是基于 .NET 的命令行界面(CLI)和脚本语言…...

计算机网络 (15)宽带接入技术
前言 计算机网络宽带接入技术是指通过高速、大容量的通信信道或网络,实现用户与互联网或其他通信网络之间的高速连接。 一、宽带接入技术的定义与特点 定义:宽带接入技术是指能够传输大量数据的通信信道或网络,其传输速度通常较高,…...
前端Python应用指南(六)构建RESTful API:使用Flask和Django实现用户认证与授权
《写给前端的python应用指南》系列: (一)快速构建 Web 服务器 - Flask vs Node.js 对比(二)深入Flask:理解Flask的应用结构与模块化设计(三)Django vs Flask:哪种框架适…...
【Unity3D】基于UGUI——简易版 UI框架
https://github.com/AMikeW/BStandShaderResources/blob/master/milk_UIFramework.unitypackage UI框架支持如下功能: 1、层级控制 2、支持面板多次打开时,隐藏前一个打开的面板,当关闭面板时,能够恢复前一个打开面板状态 3、支…...
算法排序算法
文章目录 快速排序[leetcode 215数组中的第K个最大元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/)分析题解快速排序 桶排序[leetcode 347 前K个高频元素](https://leetcode.cn/problems/top-k-frequent-elements/)分析题解 快速排序 leetcode 215数组…...
第3章 总线
总线的定义 为多个部件 分时共享 公共信息传送线路。 系统之间、模块之间、芯片内部用来传递信息信号线集合。 共享 总线上可连接多个部件 各部件间相互交换信息 都可通过总线来。 分时 同一时刻 总线上只能传 一个部件信息。 采用标准总线的优点 简化系统软硬件设计 从硬件角度…...

手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电
手机实时提取SIM卡打电话的信令声音 --双卡手机来电如何获取哪一个卡的来电 一、前言 前面的篇章《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》中,我们论述了局域网SIP坐席通过手机外呼出去时,手机中主副卡的呼叫调度策略。 但…...
共阳极LED的控制与短路问题解析
共阳极LED的控制与短路问题解析 在电子电路中,LED(发光二极管)是最常见的元件之一。LED的连接方式分为共阳极和共阴极,不同的连接方式决定了LED的控制逻辑。本文将重点讲解共阳极LED的工作原理,并解答“为什么给1不会…...

华为消费级QLC SSD来了
近日,有关消息显示,华为的消费级SSD产品线,eKitStor Xtreme 200E系列,在韩国一家在线零售商处首次公开销售,引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年,但直到今年6月才正式推出面向…...

liunx下载gitlab
1.地址: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 安装 postfix 并启动 yum install postfix systemctl start postfix systemctl enable postfix ssh服务启动 systemctl enable sshd systemctl start sshd开放 ssh 以及 http 服务,…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...