Flutter幻灯片展示插件slide_show_pro的使用

Flutter幻灯片展示插件slide_show_pro的使用

Slide Show Pro 是一个旨在简化创建动画幻灯片的包。使用 Slide Show Pro,您可以轻松地将各种动画效果(如淡入淡出、缩放、滑动和旋转)集成到您的项目中。

无论是构建图像画廊、产品展示还是任何需要平滑且吸引人动画的功能,Slide Show Pro 都可以轻松实现专业级的效果,而无需过多的努力。

特性

  • 多种动画效果:可以轻松应用不同的动画效果,包括:

    • 淡入淡出:通过淡入淡出效果平滑过渡图像。
    • 缩放:创建缩放效果以增强视觉吸引力。
    • 滑动:通过滑动效果将图像移入和移出视图。
    • 旋转:为图像添加旋转效果以获得动态显示。
  • 混合搭配:可以组合不同的效果来创建令人惊叹的动态过渡。

  • 可定制:可以根据特定需求调整各种参数。

  • 用户友好:实现专业级效果,无需太多努力。

使用方法

让我们看看如何使用 SlideShowProPage 和不同的动画效果。

初始启动时使用效果

const SlideShowProPage(
  children: [
    FadeEffect(child: Placeholder()),
    ScaleEffect(child: Placeholder()),
    RotateEffect.fromLeft(child: Placeholder()),
    SlideEffect.fromLeft(child: Placeholder()),
  ],
)

SlideShowPro 效果列表

以下效果可以在 SlideShowPro 中使用,以向幻灯片添加动画效果:

效果

  • FadeEffect

    • 添加淡入淡出的过渡效果。
  • ScaleEffect

    • 添加缩放的过渡效果。
  • RotateEffect

    • 启用旋转动画,并使用命名构造函数指定方向:
      • RotateEffect.fromLeft
      • RotateEffect.fromRight
  • SlideEffect

    • 允许从不同方向进行滑动动画,并通过命名构造函数选择:
      • SlideEffect.fromLeft
      • SlideEffect.fromRight
      • SlideEffect.reverseVertical:反向垂直滑动
      • SlideEffect.fromTop
      • SlideEffect.fromBottom
      • SlideEffect.reverseHorizontal:反向水平滑动
  • FixedPositionEffect

    • 将幻灯片固定在一个位置,并使用命名构造函数指定方向:
      • FixedPositionEffect.vertical
      • FixedPositionEffect.horizontal

构造函数方法

为了创建包含大量项目的幻灯片,所有项目都共享相同的动画效果,可以使用 SlideShowProPage.builder 方法。

Widget build(BuildContext context) {
  return Scaffold(
    body: SlideShowProPage.builder(
      itemsCount: 10,
      infiniteScroll: true,
      itemBuilder: (context, index) {
        return EffectsBuilder(
          child: Container(color: Colors.grey, child: const Placeholder()),
          enteringBuilder: (child) {
            return FadeEffect(child: child);
          },
          exitingBuilder: (child) {
            return SlideEffect.fromLeft(child: child);
          },
        );
      },
    ),
  );
}

效果构建器

使用 EffectsBuilder 可以自定义进入和退出效果。

SlideShowProPage(
  children: [
    EffectsBuilder(
      child: const Placeholder(),
      enteringBuilder: (child) {
        return child;
      },
      exitingBuilder: (child) {
        return FixedPositionEffect.vertical(child: child);
      },
    ),
    EffectsBuilder(
      child: const Placeholder(),
      enteringBuilder: (child) {
        return const FadeEffect(child: Placeholder());
      },
      exitingBuilder: (child) {
        return SlideEffect.fromLeft(child: child);
      },
    ),
  ],
)

显示效果

为了在小部件居中时显示其内容,可以使用 Appear 效果。可用选项包括:

  • FadeAppear

    • 添加淡入的出现过渡效果。
  • ScaleAppear

    • 添加缩放的出现过渡效果。
  • SlideAppear

    • 启用从不同方向滑入的出现动画,并通过命名构造函数选择:
      • SlideAppear.fromLeft
      • SlideAppear.fromRight
      • SlideAppear.fromTop
      • SlideAppear.fromBottom
Widget build(BuildContext context) {
  return Scaffold(
    body: SlideShowProPage(
      children: [
        RotateEffect.fromLeft(
          child: Container(
            color: Colors.black12,
            child: const ScaleAppear(
              child: Center(
                child: Text(
                  'Item 1',
                  style: TextStyle(fontSize: 24),
                ),
              ),
            ),
          ),
        ),
        SlideEffect.fromLeft(
          child: Container(
            color: Colors.black26,
            child: const FadeAppear(
              child: Center(
                child: Text(
                  'Item 2',
                  style: TextStyle(fontSize: 24),
                ),
              ),
            ),
          ),
        ),
      ],
    ),
  );
}

完整示例

以下是一个完整的示例,展示了如何使用 SlideShowPro 包。

import 'package:flutter/material.dart';
import 'package:slide_show_pro/slide_show_pro.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Slide Show Pro',
      debugShowCheckedModeBanner: false,
      home: ExamplePage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Slide Show Pro Example')),
      body: SlideShowProPage(
        infiniteScroll: true,
        initialPage: 0,
        children: [
          EffectsBuilder(
            child: const FadeSlide(
              backgroundImage: 'assets/background_0.jpg',
              shortDescription: 'Slide 1: Fade left',
              alignment: Alignment.centerLeft,
            ),
            enteringBuilder: (child) {
              return child;
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const FadeSlide(
              backgroundImage: 'assets/background_1.jpg',
              shortDescription: 'Slide 2: Fade left',
              alignment: Alignment.centerLeft,
            ),
            enteringBuilder: (child) {
              return FadeEffect(child: child);
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const SlideTopSlide(
              backgroundImage: 'assets/background_2.jpg',
              shortDescription: 'Slide 3: Slide left',
              alignment: Alignment.centerLeft,
            ),
            enteringBuilder: (child) {
              return SlideEffect.fromLeft(child: child);
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const SlideBottomSlide(
              backgroundImage: 'assets/background_3.jpg',
              shortDescription: 'Slide 4: Slide right',
              alignment: Alignment.centerRight,
            ),
            enteringBuilder: (child) {
              return SlideEffect.fromRight(child: child);
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const FadeSlide(
              backgroundImage: 'assets/background_4.jpg',
              shortDescription: 'Slide 5: Fade right',
              alignment: Alignment.centerRight,
            ),
            enteringBuilder: (child) {
              return ScaleEffect(child: child);
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const FadeSlide(
              backgroundImage: 'assets/background_0.jpg',
              shortDescription: 'Slide 6: Slide top',
              alignment: Alignment.centerLeft,
            ),
            enteringBuilder: (child) {
              return SlideEffect.reverseVertical(child: child);
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const FadeSlide(
              backgroundImage: 'assets/background_1.jpg',
              shortDescription: 'Slide 7: Slide bottom',
              alignment: Alignment.centerRight,
            ),
            enteringBuilder: (child) {
              return child;
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const FadeSlide(
              backgroundImage: 'assets/background_2.jpg',
              shortDescription: 'Slide 8: Rotate left',
              alignment: Alignment.centerRight,
            ),
            enteringBuilder: (child) {
              return RotateEffect.fromLeft(child: child);
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const FadeSlide(
              backgroundImage: 'assets/background_3.jpg',
              shortDescription: 'Slide 9: Rotate right',
              alignment: Alignment.centerRight,
            ),
            enteringBuilder: (child) {
              return RotateEffect.fromRight(child: child);
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const FadeSlide(
              backgroundImage: 'assets/background_4.jpg',
              shortDescription: 'Slide 10: Rotate left',
              alignment: Alignment.centerRight,
            ),
            enteringBuilder: (child) {
              return SlideEffect.reverseHorizontal(
                  child: RotateEffect.fromLeft(child: child));
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
          EffectsBuilder(
            child: const FadeSlide(
              backgroundImage: 'assets/background_2.jpg',
              shortDescription: 'Slide 11: Rotate right',
              alignment: Alignment.centerRight,
            ),
            enteringBuilder: (child) {
              return SlideEffect.reverseVertical(
                  child: RotateEffect.fromRight(child: child));
            },
            exitingBuilder: (child) {
              return FixedPositionEffect.vertical(child: child);
            },
          ),
        ],
      ),
    );
  }
}

class FadeSlide extends StatelessWidget {
  final String backgroundImage;
  final String shortDescription;
  final Alignment alignment;
  const FadeSlide(
      {super.key,
      required this.backgroundImage,
      required this.shortDescription,
      required this.alignment});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        image: DecorationImage(
          image: AssetImage(backgroundImage),
          fit: BoxFit.cover,
        ),
      ),
      child: FadeAppear(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: shortDescription.split(' ').map((word) {
            return Padding(
              padding: const EdgeInsets.all(16.0),
              child: Text(word,
                  style: Theme.of(context).textTheme.displayLarge?.copyWith(
                        color: Colors.white,
                      )),
            );
          }).toList(),
        ),
      ),
    );
  }
}

class ScaleSlide extends StatelessWidget {
  final String backgroundImage;
  final String shortDescription;
  final Alignment alignment;
  const ScaleSlide(
      {super.key,
      required this.backgroundImage,
      required this.shortDescription,
      required this.alignment});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        image: DecorationImage(
          image: AssetImage(backgroundImage),
          fit: BoxFit.cover,
        ),
      ),
      child: ScaleAppear(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: shortDescription.split(' ').map((word) {
            return Padding(
              padding: const EdgeInsets.all(16.0),
              child: Text(word,
                  style: Theme.of(context).textTheme.displayLarge?.copyWith(
                        color: Colors.white,
                      )),
            );
          }).toList(),
        ),
      ),
    );
  }
}

class SlideBottomSlide extends StatelessWidget {
  final String backgroundImage;
  final String shortDescription;
  final Alignment alignment;
  const SlideBottomSlide(
      {super.key,
      required this.backgroundImage,
      required this.shortDescription,
      required this.alignment});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        image: DecorationImage(
          image: AssetImage(backgroundImage),
          fit: BoxFit.cover,
        ),
      ),
      child: SlideAppear.fromBottom(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: shortDescription.split(' ').map((word) {
            return Padding(
              padding: const EdgeInsets.all(16.0),
              child: Text(word,
                  style: Theme.of(context).textTheme.displayLarge?.copyWith(
                        color: Colors.white,
                      )),
            );
          }).toList(),
        ),
      ),
    );
  }
}

class SlideTopSlide extends StatelessWidget {
  final String backgroundImage;
  final String shortDescription;
  final Alignment alignment;
  const SlideTopSlide(
      {super.key,
      required this.backgroundImage,
      required this.shortDescription,
      required this.alignment});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        image: DecorationImage(
          image: AssetImage(backgroundImage),
          fit: BoxFit.cover,
        ),
      ),
      child: SlideAppear.fromTop(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: shortDescription.split(' ').map((word) {
            return Padding(
              padding: const EdgeInsets.all(16.0),
              child: Text(word,
                  style: Theme.of(context).textTheme.displayLarge?.copyWith(
                        color: Colors.white,
                      )),
            );
          }).toList(),
        ),
      ),
    );
  }
}

更多关于Flutter幻灯片展示插件slide_show_pro的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter幻灯片展示插件slide_show_pro的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用slide_show_pro插件来实现幻灯片展示的示例代码。

首先,确保你已经在pubspec.yaml文件中添加了slide_show_pro依赖:

dependencies:
  flutter:
    sdk: flutter
  slide_show_pro: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter项目中创建一个幻灯片展示页面。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:slide_show_pro/slide_show_pro.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Slide Show Pro Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SlideShowPage(),
    );
  }
}

class SlideShowPage extends StatefulWidget {
  @override
  _SlideShowPageState createState() => _SlideShowPageState();
}

class _SlideShowPageState extends State<SlideShowPage> {
  List<String> images = [
    'https://example.com/image1.jpg',
    'https://example.com/image2.jpg',
    'https://example.com/image3.jpg',
    // 添加更多图片URL
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Slide Show Pro Demo'),
      ),
      body: SlideShowPro(
        imageUrls: images,
        loop: true,
        autoPlay: true,
        interval: 3000, // 切换间隔时间,单位毫秒
        indicatorColor: Colors.white,
        indicatorActiveColor: Colors.blue,
        indicatorSize: 10.0,
        indicatorPadding: 5.0,
        indicatorPosition: IndicatorPosition.bottom,
        onClick: (index) {
          print('Clicked on image index: $index');
        },
        onLoad: (index) {
          print('Loaded image index: $index');
        },
        onComplete: () {
          print('Slide show completed');
        },
      ),
    );
  }
}

在这个示例中,我们创建了一个名为SlideShowPage的页面,其中使用了SlideShowPro组件来展示幻灯片。SlideShowPro组件接受以下参数:

  • imageUrls:一个包含图片URL的列表。
  • loop:是否循环播放。
  • autoPlay:是否自动播放。
  • interval:图片切换的间隔时间(毫秒)。
  • indicatorColor:指示器的颜色。
  • indicatorActiveColor:当前选中指示器的颜色。
  • indicatorSize:指示器的大小。
  • indicatorPadding:指示器之间的间距。
  • indicatorPosition:指示器的位置(顶部、底部)。
  • onClick:点击图片时的回调函数。
  • onLoad:图片加载时的回调函数。
  • onComplete:幻灯片播放完成时的回调函数。

你可以根据自己的需求调整这些参数。确保将images列表中的URL替换为你自己的图片URL。

这个示例展示了如何使用slide_show_pro插件在Flutter应用中实现一个基本的幻灯片展示功能。根据你的具体需求,你可以进一步自定义和扩展这个示例。

回到顶部