做问卷调查的网站挣钱网页设计制作网站html代码大全

张小明 2025/12/26 19:41:02
做问卷调查的网站挣钱,网页设计制作网站html代码大全,北京网上注册公司,成都旅游景点攻略效果图 数据流 原始数据 (carouselItems) ↓ 包装 无限循环数据 (infiniteItems) ↓ 传递 PageView.builder → 渲染图片 核心组件 1. PageController 核心控制器#xff0c;管理页面滚动viewportFraction: 1.0#xff1a;每页占满屏幕initialPage: 1#xff1a;从真实第…效果图数据流原始数据 (carouselItems) ↓ 包装 无限循环数据 (infiniteItems) ↓ 传递 PageView.builder → 渲染图片核心组件1. PageController 核心控制器管理页面滚动 viewportFraction: 1.0每页占满屏幕 initialPage: 1从真实第一张开始 2. PageView.builder 懒加载构建页面 支持无限滚动 与PageController配合 3. AnimatedContainer 实现指示器动画效果 自动处理属性变化的动画无限循环轮播图的核心技巧1.假设原始数据有3张图片carouselItems [A, B, C] 2.扩展数据 infiniteItems [ carouselItems.last, // C ← 最后一张放在最前面 ...carouselItems, // A, B, C ← 原始数据 carouselItems.first, // A ← 第一张放在最后面 ] 得到 索引: 0 1 2 3 4 数据: [C] [A] [B] [C] [A] 3.初始状态 用户看到的 [A] [B] [C] 实际数据 [C] [A] [B] [C] [A] ↑ ↑ ↑ ↑ ↑ 索引 0 1 2 3 4 当前显示 (索引1显示A) 4.非边界滑动情况 滑动前 [C] [A] [B] [C] [A] 显示A (索引1) 滑动后 [C] [A] [B] [C] [A] 显示B (索引2) 5.滑动到最左边边界当用户从A(索引1)向左滑到C(索引0)时 滑动后 [C] [A] [B] [C] [A] 显示C (索引0) 此时程序检测到索引0 0边界条件 立即跳转到索引3也是C 跳转后 [C] [A] [B] [C] [A] 显示C (索引3) 6.滑动到最右边边界当用户从C(索引3)向右滑到A(索引4)时 滑动后 [C] [A] [B] [C] [A] 显示A (索引4) 此时程序检测到索引4 数组长度-1 立即跳转到索引1也是A 跳转后 [C] [A] [B] [C] [A] 显示A (索引1)代码逻辑对应void _onPageChanged(int index) { if (index 0) { // 滑到了最左边的假C _pageController.jumpToPage(3); // 跳转到最右边的真C _currentIndex 2; // 显示原始数据的最后一项(索引2) } else if (index 4) { // 滑到了最右边的假A _pageController.jumpToPage(1); // 跳转到最左边的真A _currentIndex 0; // 显示原始数据的第一项(索引0) } else { // 正常滑动 _currentIndex index - 1; // 减去前面的假C } }实现步骤1.准备图片//轮播图数据 final ListString carouselItems [ assets/images/apple.png, assets/images/banana.png, assets/images/cherry.png, ];2.定义一些必要的变量late PageController _pageController; //核心控制器 int _currentIndex 1; // 从原始数据的第一个开始注意索引1对应原始数据的第一个 Timer? _timer;//定时器3.为了实现无缝循环扩展图片数据//实现无缝循环 ListString get infiniteItems { return [ carouselItems.last, // 最后一项放在最前面 ...carouselItems, // 原始数据 carouselItems.first, // 第一项放在最后面 ]; }4.初始化override void initState() { super.initState(); //初始胡控制器 _pageController PageController( viewportFraction: 1.0, //每个页面占视口的比例0.0~1.0 initialPage: 1, //初始显示第几页 ); _startAutoPlay(); //开始自动播放 }5.注销控制器override void dispose() { _timer?.cancel(); _pageController.dispose(); super.dispose(); }6.开始自动播放的方法//开始自动播放 void _startAutoPlay() { //Timer.periodic:创建一个周期性定时器 _timer Timer.periodic(const Duration(seconds: 3), (timer) { //每3秒执行一次回调函数 //页面安全判断 if (!mounted) return; //页面切换 _pageController.nextPage( //切换下一页的方法 duration: const Duration(milliseconds: 800), //动画持续时间 curve: Curves.fastOutSlowIn,//动画曲线为 先加速后减速 ); }); }7.页面切换的回调函数//页面切换的回调函数 void _onPageChanged(int index) { // 处理边界情况实现无缝循环 if (index 0) { // 如果滚动到虚拟的第一页实际是原始数据的最后一页 // 无动画跳转到真实数据的最后一页 _pageController.jumpToPage(carouselItems.length); setState(() { _currentIndex carouselItems.length - 1; // 显示指示器为最后一页 }); } else if (index infiniteItems.length - 1) { // 如果滚动到虚拟的最后一页实际是原始数据的第一页 // 无动画跳转到真实数据的第一页 _pageController.jumpToPage(1); setState(() { _currentIndex 0; // 显示指示器为第一页 }); } else { // 正常页面变化 setState(() { _currentIndex index - 1; // 转换为原始数据的索引 }); } }8.暂停播放和继续播放//暂停自动播放 void _pauseAutoPlay() { _timer?.cancel(); } //继续自动播放 void _resumeAutoPlay() { _timer?.cancel(); _startAutoPlay(); }9.轮播图的核心*******// 轮播图区域 SizedBox( height: 142, // 固定高度 child: PageView.builder( controller: _pageController, //控制器 onPageChanged: _onPageChanged,//页面切换回调 itemCount: infiniteItems.length, //总页数 physics: const ClampingScrollPhysics(), //滚动物理效果 itemBuilder: (context, index) { return GestureDetector( onTap: () { // 计算真实数据的索引 int realIndex index - 1; if (realIndex 0) realIndex carouselItems.length - 1; if (realIndex carouselItems.length) realIndex 0; _handleCarouselTap(realIndex); }, onTapDown: (_) _pauseAutoPlay(), //按下时暂停自动播放 onTapCancel: () _resumeAutoPlay(), //取消点击时恢复 onTapUp: (_) _resumeAutoPlay(), //抬起时恢复 child: Container( margin: EdgeInsets.symmetric(horizontal: 20), decoration: BoxDecoration( image: DecorationImage( image: AssetImage(infiniteItems[index]), fit: BoxFit.contain, ), ), ), ); }, ), ),10.分页指示器的实现// 分页指示器 Container( margin: const EdgeInsets.only(top: 10), // 距离上方10像素的外边距 height: 20, // 容器高度20像素 child: Row( // 水平排列子组件 mainAxisAlignment: MainAxisAlignment.center, // 子组件水平居中 children: List.generate( // 动态生成指示点列表 carouselItems.length, // 根据轮播图数量生成 (index) AnimatedContainer( // 每个指示点是一个动画容器 duration: const Duration(milliseconds: 300), // 动画持续时间300ms width: _currentIndex index ? 20 : 8, // 当前激活点宽20其他宽8 height: 8, // 所有点高度固定为8 margin: const EdgeInsets.symmetric(horizontal: 4), // 左右间距4像素 decoration: BoxDecoration( shape: BoxShape.circle, // 圆形形状 color: _currentIndex index // 颜色激活点蓝色其他灰色 ? Colors.blue : Colors.grey.withOpacity(0.3), ), ), ), ), ),11.单击的方法void _handleCarouselTap(int index) { print(点击了: ${carouselItems[index]}); }代码实例import dart:async; import package:flutter/cupertino.dart; import package:flutter/material.dart; class DialMain extends StatefulWidget { const DialMain({super.key}); override StateStatefulWidget createState() _DialMainState(); } class _DialMainState extends StateDialMain with SingleTickerProviderStateMixin { //轮播图数据 final ListString carouselItems [ assets/images/apple.png, assets/images/banana.png, assets/images/cherry.png, ]; late PageController _pageController; //核心控制器 int _currentIndex 1; // 从原始数据的第一个开始注意索引1对应原始数据的第一个 Timer? _timer;//定时器 //实现无缝循环 ListString get infiniteItems { return [ carouselItems.last, // 最后一项放在最前面 ...carouselItems, // 原始数据 carouselItems.first, // 第一项放在最后面 ]; } override void initState() { super.initState(); //初始胡控制器 _pageController PageController( viewportFraction: 1.0, //每个页面占视口的比例0.0~1.0 initialPage: 1, //初始显示第几页 ); _startAutoPlay(); //开始自动播放 } override void dispose() { _timer?.cancel(); _pageController.dispose(); super.dispose(); } //开始自动播放 void _startAutoPlay() { //Timer.periodic:创建一个周期性定时器 _timer Timer.periodic(const Duration(seconds: 3), (timer) { //每3秒执行一次回调函数 //页面安全判断 if (!mounted) return; //页面切换 _pageController.nextPage( //切换下一页的方法 duration: const Duration(milliseconds: 800), //动画持续时间 curve: Curves.fastOutSlowIn,//动画曲线为 先加速后减速 ); }); } //页面切换的回调函数 void _onPageChanged(int index) { // 处理边界情况实现无缝循环 if (index 0) { // 如果滚动到虚拟的第一页实际是原始数据的最后一页 // 无动画跳转到真实数据的最后一页 _pageController.jumpToPage(carouselItems.length); setState(() { _currentIndex carouselItems.length - 1; // 显示指示器为最后一页 }); } else if (index infiniteItems.length - 1) { // 如果滚动到虚拟的最后一页实际是原始数据的第一页 // 无动画跳转到真实数据的第一页 _pageController.jumpToPage(1); setState(() { _currentIndex 0; // 显示指示器为第一页 }); } else { // 正常页面变化 setState(() { _currentIndex index - 1; // 转换为原始数据的索引 }); } } //暂停自动播放 void _pauseAutoPlay() { _timer?.cancel(); } //继续自动播放 void _resumeAutoPlay() { _timer?.cancel(); _startAutoPlay(); } override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xFFF7F7F9), appBar: AppBar( backgroundColor: const Color(0xFFF7F7F9), title: const Text(轮播图), centerTitle: true, leading: IconButton( onPressed: () Navigator.pop(context), icon: const Icon(Icons.arrow_back_ios, color: Colors.black), ), ), body: Column( children: [ // 轮播图区域 SizedBox( height: 142, // 固定高度 child: PageView.builder( controller: _pageController, //控制器 onPageChanged: _onPageChanged,//页面切换回调 itemCount: infiniteItems.length, //总页数 physics: const ClampingScrollPhysics(), //滚动物理效果 itemBuilder: (context, index) { return GestureDetector( onTap: () { // 计算真实数据的索引 int realIndex index - 1; if (realIndex 0) realIndex carouselItems.length - 1; if (realIndex carouselItems.length) realIndex 0; _handleCarouselTap(realIndex); }, onTapDown: (_) _pauseAutoPlay(), //按下时暂停自动播放 onTapCancel: () _resumeAutoPlay(), //取消点击时恢复 onTapUp: (_) _resumeAutoPlay(), //抬起时恢复 child: Container( margin: EdgeInsets.symmetric(horizontal: 20), decoration: BoxDecoration( image: DecorationImage( image: AssetImage(infiniteItems[index]), fit: BoxFit.contain, ), ), ), ); }, ), ), // 分页指示器 Container( margin: const EdgeInsets.only(top: 10), // 距离上方10像素的外边距 height: 20, // 容器高度20像素 child: Row( // 水平排列子组件 mainAxisAlignment: MainAxisAlignment.center, // 子组件水平居中 children: List.generate( // 动态生成指示点列表 carouselItems.length, // 根据轮播图数量生成 (index) AnimatedContainer( // 每个指示点是一个动画容器 duration: const Duration(milliseconds: 300), // 动画持续时间300ms width: _currentIndex index ? 20 : 8, // 当前激活点宽20其他宽8 height: 8, // 所有点高度固定为8 margin: const EdgeInsets.symmetric(horizontal: 4), // 左右间距4像素 decoration: BoxDecoration( shape: BoxShape.circle, // 圆形形状 color: _currentIndex index // 颜色激活点蓝色其他灰色 ? Colors.blue : Colors.grey.withOpacity(0.3), ), ), ), ), ), const SizedBox(height: 20), ], ), ); } void _handleCarouselTap(int index) { print(点击了: ${carouselItems[index]}); } }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

德州哪里有做网站推广的开源手机网站系统

Picotest这款产品挺不错的,但是持续电流只支持6A,有没有能支持15A的产品呢?P2124A 是一款基于氮化镓 (GaN) 的探头,用于 PSNR 和其他抗噪性能测试。它将电源轨电压与调制信号相结合,施加到待测器件 (DUT) 上&#xff0…

张小明 2025/12/26 19:41:00 网站建设

成都做网站建设的公司icp网站备案系统

Deforum动画制作完全教程:从零开始掌握AI动态绘画 【免费下载链接】sd-webui-deforum Deforum extension for AUTOMATIC1111s Stable Diffusion webui 项目地址: https://gitcode.com/gh_mirrors/sd/sd-webui-deforum 想要将静态的AI绘画转化为生动的动画作品…

张小明 2025/12/26 19:39:51 网站建设

汕头做网站优化哪家好吴江做网站的公司

文本生成图像FID指标权威指南:从基础原理到实战应用全解析 【免费下载链接】diffusers-cd_bedroom256_l2 项目地址: https://ai.gitcode.com/hf_mirrors/openai/diffusers-cd_bedroom256_l2 在文本生成图像技术快速发展的今天,如何科学评估生成图…

张小明 2025/12/26 19:39:15 网站建设

做联轴器的网站小程序制作用华网天下优惠

文章目录具体实现截图主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 本系统(程序源码数据库调试部署讲解)带文档1万…

张小明 2025/12/26 19:38:05 网站建设

网站建设明细wordpress主题的网站

在Ubuntu系统中,结合Qt和C开发的应用程序可通过以下多种方式安全或强制终止,具体可分为系统级、Qt框架、C标准及线程管理四大类:系统级方法终端命令kill/pkill/killall:通过进程ID或名称发送信号(如SIGTERM正常终止&am…

张小明 2025/12/26 19:37:30 网站建设

网站建设销售求职wordpress照片ppt

Web应用防火墙(WAF)作为保护网站安全的重要防线,其绕过技术一直是网络安全研究的热点领域。本文将系统性地介绍WAF绕过的方法论、具体技术方案和实践策略,内容涵盖网络架构层、HTTP协议层、应用层以及数据库层的绕过技术,并提供详细的案例分析…

张小明 2025/12/26 19:36:57 网站建设