flutter-制作淡入淡出的Banner切换Fade效果

文章目录

  • [1. 介绍](#1. 介绍)
  • [2. 例子](#2. 例子)

1. 介绍

本节主要介绍如何制作一个淡入淡出的 Fade 过渡 Banner 切换。Fade 过渡通常指的是当元素(如图片、文本框等)显示或隐藏时,元素的透明度会逐渐变化,从而实现平滑的视觉过渡效果。这种效果可以提升用户的体验,使得页面的交互更加自然和流畅。

  • 效果图

2. 例子

  • main.dart
dart 复制代码
import 'package:xxx/fadeBanner.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: FadeBannerWidget()
    );
  }
}
  • fadeBanner.dart
dart 复制代码
import 'package:flutter/material.dart';
import 'dart:async';

class FadeBannerWidget extends StatefulWidget {
  const FadeBannerWidget({super.key});

  @override
  FadeBannerWidgetState createState() => FadeBannerWidgetState();
}

class FadeBannerWidgetState extends State<FadeBannerWidget>
    with SingleTickerProviderStateMixin {
  /// 图片列表
  final List<String> imageList = [
    'https://xxxxx.jpg',
    'https://xxxxx.jpg'
  ];

  /// Fade持续时长
  static const fadeDuration = Duration(milliseconds: 300);

  /// Banner切换时长
  static const bannerDuration = Duration(milliseconds: 3000);

  /// 当前图片索引
  int currentImageIndex = 0;

  /// 动画控制器
  late AnimationController animeController;

  /// 图片定时器
  late Timer imageTimer;

  @override
  void initState() {
    super.initState();
    // 初始化动画控制器
    animeController = AnimationController(vsync: this, duration: fadeDuration);
    // 动画发射
    animeController.forward();
    // 初始化图片定时器
    imageTimer = Timer.periodic(bannerDuration, (_) {
      currentImageIndex = (currentImageIndex + 1) % imageList.length;
      setState(() {});
    });
  }

  @override
  void dispose() {
    animeController.dispose();
    imageTimer.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
            alignment: Alignment.center,
            color: const Color(0xFF3F3F3F),
            child: AnimatedSwitcher(
                duration: bannerDuration,
                child: FadeTransition(
                    opacity: animeController,
                    key: ValueKey<int>(currentImageIndex),
                    child: Image.network(imageList[currentImageIndex])))));
  }
}

本次分享就到这儿啦,我是鹏多多,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~

往期文章

个人主页

相关推荐
小 黄 鸡4 小时前
Flutter 面试必会知识点详解(从基础到进阶)
flutter·面试·职场和发展
大龄秃头程序员11 小时前
Flutter 最少代码验证:为什么子 Isolate 调原生,一定要先回到主 Isolate?
flutter
FungLeo12 小时前
成为全栈·Flutter App 篇·分类、标签与搜索:移动端内容发现
flutter·移动开发·标签·搜索·分类管理·成为全栈
m0_7381858214 小时前
Flutter 鸿蒙化实战:the_apple_sign_in 适配 OpenHarmony,Apple 登录
flutter·华为·harmonyos·鸿蒙
m0_7381858214 小时前
Flutter 鸿蒙化实战:umeng_analytics_plugin 适配 OpenHarmony,友盟统计
flutter·华为·harmonyos·鸿蒙
FungLeo15 小时前
成为全栈·Flutter App 篇·列表分页与下拉刷新:去重、失败保留和返回位置
flutter·移动开发·下拉刷新·分页加载·列表优化·成为全栈
大龄秃头程序员17 小时前
【从一道面试题入手】深入理解 Dart 事件循环调度机制
flutter
恋猫de小郭18 小时前
Kotlin 2.5 的 Companion 改造,对 KMP 的重要升级
android·前端·flutter
程序员老刘1 天前
Flutter你看看人家RN
flutter·react native·ai编程
大龄秃头程序员2 天前
【Flutter Bloc 从 0 到 1】用最少代码跑通 Bloc
flutter