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 布局模型中使…...
【算法】复杂性理论初步
六、算法复杂性初步 重要的复杂性类 P P P 的定义 多项式时间内可解的问题 若 L ∈ P L∈P L∈P,则存在确定性多项式时间的图灵机 M M M,使得 M ( x ) 1 ⟺ x ∈ L M(x)1⟺x∈L M(x)1⟺x∈L N P NP NP 的定义 多项式时间内可验证验证解的正确性 &…...
vscode实用插件(持续更新)
目录 Git History Diff Git Graph Error Lens Git History Diff 用于将当前分支的某个文件夹与远程分支的相同文件夹做对比,方便代码评审!解决了为了一个问题而多次commit,导致代码不好评审,即不晓得和远程分支相比࿰…...
使用Lodash工具库的orderby和sortby进行排序的区别
简介 _.orderBy 和 _.sortBy 是 Lodash 库中用于排序数组的两个函数。 区别 _.orderBy 允许你指定一个或多个属性来排序,并为每个属性指定排序方向(升序或降序)。默认所有值为升序排,指定为"desc" 降序,…...
胡闹厨房练习(三)
ScriptableObject 一、初步了解 1、实质:是一种特殊类型的Unity对象, 2、作用:用于存储大量数据,而不必依附于游戏场景中的某个GameObject。 3、特点: 可以在不增加场景中对象数量的情况下,管理和存储复杂的数据结构、配置信息、游戏状态等。 4、适用:非常适合用来…...
Postman接口测试01|接口测试基础概念、http协议、RESTful风格、接口文档
目录 一、接口测试基础概念 1、什么是接口 2、接口的类型 3、什么是接口测试 4、为什么要做接口测试 5、接口测试的实现方式 6、什么是自动化接口测试? 二、接口返回的数据格式 1、三种格式 2、Json 三、接口协议 1、webservice协议 2、dubbo协议 3、…...
算法进阶:贪心算法
贪心算法是一种简单而直观的算法思想,它在每一步选择中都采取在当前状态下最优的选择,以期望最终得到全局最优解。贪心算法通常适用于一些具有最优子结构的问题,即问题的最优解可以通过一系列局部最优解的选择得到。 贪心算法的基本思路是&a…...
深度学习笔记(6)——循环神经网络RNN
循环神经网络 RNN 核心思想:RNN内部有一个“内部状态”,随着序列处理而更新 h t f W ( h t − 1 , x t ) h_tf_W(h_{t-1},x_t) htfW(ht−1,xt) 一般来说 h t t a n h ( W h h h t − 1 W x h x t ) h_ttanh(W_{hh}h_{t-1}W_{xh}x_t) httanh(Whhht−1Wxhxt…...
电商项目高级篇07-redisson分布式锁
redisson分布式锁 1、引入maven依赖2、config类3、可重入锁设计 1、引入maven依赖 <!--引入redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version></depend…...
STM32中断详解
STM32中断详解 NVIC 中断系统中断向量表相关寄存器中断优先级中断配置 外部中断实验EXTI框图外部中断/事件线映射中断步骤初始化代码实现 定时器中断通用定时器相关功能标号1:时钟源标号 2:控制器标号 3:时基单元 代码实现 NVIC 中断系统 STM…...
KNN分类算法 HNUST【数据分析技术】(2025)
1.理论知识 KNN(K-Nearest Neighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。 KNN算法的思想: 对于任意n维输入向量,分别对应于特征…...
【Win11】安装 VMware17 和 Ubuntu
【Win11】安装 VMware17 和 Ubuntu 15 版本和 Win11 家庭版间的兼容应该有 BUG,请直接跳至【VMware 17】 安装【VMware 15】 本来是按如下资源链接安装的,但发现 15 版本和 Win11 家庭版间的兼容应该有 BUG,在安装并关闭 Hyper-Vÿ…...
Jmeter快速入门
目录 1.安装Jmeter 1.1.下载 1.2.解压 1.3.运行 2.快速入门 2.1.设置中文语言 2.2.基本用法 1.安装Jmeter Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量。 1.1.下载 可以Apache Jmeter官网下载,地址…...
Android Studio2024版本安装环境SDK、Gradle配置
一、软件版本,安装包附上 👉android-studio-2024.1.2.12-windows.exe👈 👉百度网盘Android Studio安装包👈 (若下载连链接失效可去百度网盘链接下载) 二、软件安装过程 三、准备运行…...
嵌入式单片机窗口看门狗控制与实现
窗口看门狗 注意:WWDG外设没有独立的时钟源,而是挂载在APB1总线下,APB1总线外设时钟为42MHZ。 了解WWDG外设的使用流程,可以参考stm32f4xx_wwdg.c的开头注释,具体流程如下图所示...
[单master节点k8s部署]43.全链路监控(二)
部署pinpoint服务端 这里安装的是pinpoint-docker,可以从GitHub - pinpoint-apm/pinpoint-docker: Officix 下载。通过readme可以看到,该项目提供的镜像: Pinpoint-Web ServerPinpoint-CollectorPinpoint-AgentPinpoint-FlinkPinpoint-Hba…...
Apache Doris 创始人:何为“现代化”的数据仓库?
在 12 月 14 日的 Doris Summit Asia 2024 上,Apache Doris 创始人 & PMC 成员马如悦在开场演讲中,围绕“现代化数据仓库”这一主题,指出 3.0 版本是 Apache Doris 研发路程中的重要里程碑,他将这一进展总结为“实时之路”、“…...
json的作用?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有简洁、易读、易于解析和生成等特点,在前后端数据交互、配置文件、数据存储等多个领域发挥着重要作用,以下是具体介绍: JSON 的作用 数据…...
ChatGPT是如何生成长文的
说实话,现在我们对chatGPT的最深的印象就是他是一个各方面知识都比较全面的机器助手,我们的问题他都能生成答案,不过大家发现没有,它生成相对应的长文的时候,都是一个词一个词蹦出来的,有的时候是一个个词组…...
微服务——部署与运维
1、你是否有将 Java 微服务部署到容器(如 Docker)中的经验?请描述一下部署过程和相关注意事项。 部署过程: 编写 Dockerfile,定义基础镜像(如 openjdk)、应用 JAR 包路径和启动命令。构建镜像…...
json笔记
1、json的组成 JSON是一个标记符序列。这套标记符包括:构造字符、字符串、数字和字面值(false, true, null)。 1.1 构造字符 六个构造字符: 左方括号 [ 右方括号 ] 左大括号 { 右大括号 } 冒号 : 逗号 , 1.2 JSON值 json值包括:对象…...
从0入门自主空中机器人-1【课程介绍】
关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…...
C++ 设计模式
代码示例 从封装变化角度分类 1.组件协作 现代软件专业分工之后的第一个结果“框架与应用程序的划分” ,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 模板方法(Template Me…...
最新版Edge浏览器加载ActiveX控件技术——alWebPlugin中间件V2.0.28-迎春版发布
allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…...
HarmonyOS NEXT应用开发实战:免费练手的网络API接口分享
学习一项技能,最好也最快的办法就是直接动手实战。在实战中不断的总结经验和收获成就感。这里分享些好用且免费的网络API练手接口,这对于想要提升自己网络开发能力的开发者来说,无疑是极大的福音。今天,我将详细介绍一个API接口集…...
高级技巧-使用Mysql 实现根据条件过滤整个分组数据
博客-mysql exists实现过滤所属条件对应分组的全部数据 在数据查询中,有时需要根据某一条件来过滤整个分组的数据,尤其是当某条记录满足特定条件时,需要将该组内的所有记录排除。本文将介绍如何使用 MySQL 的 EXISTS 关键字来实现这种分组过滤…...
LeetCode 9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,…...
园区网综合拓扑实验
一、实验要求 实验拓扑图如上图所示 1、按照图示的VLAN及IP地址需求,完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan(本实验未使用) 4、上层…...
Flink状态编程
Flink处理机制的核心就是“有状态的流处理”,在某些情况下,一条数据的计算不仅要基于当前数据自身,还需要依赖数据流中的一些其他数据。这些在一个任务中,用来辅助计算的数据我们就称之为这个任务的状态。 一、按键分区状态&…...
Ajax数据爬取
有时我们用requests 抓取页面得到的结果,可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档,而浏览器中的页面是JavaScript 处理…...
MVCC实现原理以及解决脏读、不可重复读、幻读问题
MVCC实现原理以及解决脏读、不可重复读、幻读问题 MVCC是什么?有什么作用?MVCC的实现原理行隐藏的字段undo log日志版本链Read View MVCC在RC下避免脏读MVCC在RC造成不可重复读、丢失修改MVCC在RR下解决不可重复读问题RR下仍然存在幻读的问题 MVCC是什么…...
PilotGo
title: 解锁 PilotGo:智能化运维的得力助手 date: ‘2024-12-29’ category: blog tags: PilotGo运维管理智能化工具技术应用 sig: ops archives: ‘2024-12’ author:way_back summary: PilotGo 作为一款创新的运维管理工具,凭借其智能化的特性和丰富的…...
【后端】LNMP环境搭建
长期更新各种好文,建议关注收藏! 本文近期更新完毕。 LNMPlinuxnginxmysqlphp 需要的资源 linux服务器 web服务软件nginx 对应的语言编译器代码文件 数据库mysql安装 tar.gz包或者命令行安装 进入root: sodu 或su mkdir path/{server,soft}…...
vue 本地自测iframe通讯
使用 postMessage API 来实现跨窗口(跨域)的消息传递。postMessage 允许你安全地发送消息到其他窗口,包括嵌套的 iframe,而不需要担心同源策略的问题。 发送消息(父应用) 1. 父应用:发送消息给…...
【人工智能】基于Python和OpenCV实现实时人脸识别系统:从基础到应用
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能和计算机视觉的快速发展,人脸识别技术已广泛应用于监控、安全、社交媒体、金融和医疗等领域。本文将介绍如何利用Python和Ope…...
vue2使用pdfjs-dist和jsPDF生成pdf文件
vue2使用pdfjs-dist和jsPDF生成pdf文件 1、安装依赖 npm install pdfjs-dist2.6.3472、引入依赖 import { jsPDF } from jspdf// 使用require方式导入pdfjs-dist v2.6.347,高版本报错(import导入会报错:GlobalWorkerOptions undefined&…...
深度学习算法选择
1. 卷积神经网络(Convolutional Neural Networks, CNNs) 简介 卷积神经网络擅长处理具有网格结构的数据,如图像。通过卷积层、池化层和全连接层,CNN能够自动提取和学习数据的空间特征。 应用场景 图像识别与分类:如…...
asp.net core系统记录当前在线人数
实时记录当前在线人数,登录后保持120秒在线状态,在线状态保存在缓存中,采用滑动过期,在120秒内请求了系统,自动续活120秒;超过时间则移除用户在线状态; 需要在登录过滤器标记用户在线状态需要排…...
【每日学点鸿蒙知识】Grid子项拖动、Swiper指示器、手势事件上报、指定使用发布版本API、打包签名失败报错109
1、HarmonyOS Grid组件子项拖动问题? Grid组件中有20个GridItem子组件,其中前4个GridItem是不能拖动的,其余GridItem可拖动排序。 关于可拖拽grid及gridItem可参考如下代码(注:其中 .draggable(parseInt(day) < 6…...
轻松实现向量搜索:探索 Elastic-Embedding-Searcher 项目
随着人工智能和机器学习技术的飞速发展,向量搜索已成为数据检索的重要方式。尤其是在处理大规模文本数据时,传统的基于关键词的检索方式已经难以满足需求。为了优化检索性能并提升搜索精度,向量搜索成为了更加高效的解决方案。而在这一领域&a…...
区块链平台安全属性解释
区块链平台安全属性解释 双向认证 解释:双向认证是指在通信过程中,**通信双方都需要对对方的身份进行验证,确保对方是合法的、可信任的实体。**只有双方身份都得到确认后,通信才会被允许进行,从而防止非法用户的接入和数据的窃取或篡改。举例:在基于区块链和联邦学习的数…...
matlab reshape permute
1.reshape 将向量按照顺序重新构建 矩阵,新矩阵 先排完第一列, 再第二列… 2.permute 将向量 维度变换...
《一文读懂卷积网络CNN:原理、模型与应用全解析》
《一文读懂卷积网络CNN:原理、模型与应用全解析》 一、CNN 基本原理大揭秘(一)从人类视觉到 CNN 灵感(二)核心组件详解 二、经典 CNN 模型巡礼(一)LeNet-5:开山鼻祖(二&a…...
深入理解 PyTorch 的 view() 函数:以多头注意力机制(Multi-Head Attention)为例 (中英双语)
深入理解 PyTorch 的 view() 函数:以多头注意力机制(Multi-Head Attention)为例 在深度学习模型的实现中,view() 是 PyTorch 中一个非常常用的张量操作函数,它能够改变张量的形状(shape)而不改…...
【每日学点鸿蒙知识】获取是否有网接口、获取udid报错、本地通知、Json转Map、Window10安装Hyper-v
1、有没有获取当前是否真实有网的接口? 比如当前链接的是wifi,但是当前wifi是不能访问网络的,有没有接口可以获取到这个真实的网络访问状态? 请参考说明链接:https://developer.huawei.com/consumer/cn/doc/harmonyo…...
《Vue3 四》Vue 的组件化
组件化:将一个页面拆分成一个个小的功能模块,每个功能模块完成自己部分的独立的功能。任何应用都可以被抽象成一棵组件树。 Vue 中的根组件: Vue.createApp() 中传入对象的本质上就是一个组件,称之为根组件(APP 组件…...
Linux:alias别名永久有效
一、背景 日常使用bash时候,有些常用的命令参数的组合命令太长,很难记,此时可以利用Linux提供的alias命令生成命令的别名(命令的隐射),但是我们会发现,当退出了终端后重新登录就失效了ÿ…...
MicroDiffusion——采用新的掩码方法和改进的 Transformer 架构,实现了低预算的扩散模型
介绍 论文地址:https://arxiv.org/abs/2407.15811 现代图像生成模型擅长创建自然、高质量的内容,每年生成的图像超过十亿幅。然而,从头开始训练这些模型极其昂贵和耗时。文本到图像(T2I)扩散模型降低了部分计算成本&a…...
网神SecFox FastJson反序列化RCE漏洞复现(附脚本)
0x01 产品描述: 网神SecFox是奇安信网神信息技术(北京)股份有限公司推出的一款运维安全管理与审计系统,集“身份认证、账户管理、权限控制、运维审计”于一体,提供统一运维身份认证、细粒度的权限控制、丰富的运维审计报告、多维度的预警…...
解决无法在 Ubuntu 24.04 上运行 AppImage 应用
在 Ubuntu 24.04 中运行 AppImage 应用的完整指南 在 Ubuntu 24.04 中,许多用户可能会遇到 AppImage 应用无法启动的问题。即使你已经设置了正确的文件权限,AppImage 仍然拒绝运行。这通常是由于缺少必要的库文件所致。 问题根源:缺少 FUSE…...