Flutter动态波浪效果插件wave_blob的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter动态波浪效果插件wave_blob的使用

Features

wave_blob插件提供了一个可以自定义的波浪动画效果。您可以根据语音的振幅来播放音频。

Blob Wave Animation

这个包提供了一个可以根据需求定制的波浪动画。你可以通过调整参数来改变动画的效果。

Preview

以下是插件的一个预览图:

Blob Wave Animation Preview

Getting Started

Installing

  1. pubspec.yaml文件中添加依赖:

    dependencies:
      wave_blob: <latest-version>
    
  2. 运行flutter pub get命令以安装依赖。

  3. 导入包:

    import 'package:wave_blob/wave_blob.dart';
    

Usage

Simple Usage

将Widget包裹在WaveBlob中,并分配必要的参数。

SizedBox(
  width: MediaQuery.sizeOf(context).width * 0.4,
  height: MediaQuery.sizeOf(context).width * 0.4,
  child: WaveBlob(
    child: const Icon(
      Icons.mic,
      color: Colors.white,
      size: 50.0,
    ),
  ),
),

注意:不要忘记设置Widget的宽度和高度。

更多详情请查看example app

Customization

您可以轻松地自定义blob效果,包括更改blob颜色、动画速度、最小和最大半径等。

示例:

Customization Example Customization Example

完整示例Demo

以下是一个完整的示例代码,展示了如何使用wave_blob插件创建一个带有可调节振幅和缩放比例的波浪动画效果。

import 'dart:async';

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

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  double _scale = 1.0;
  double _amplitude = 4250.0;

  bool _autoScale = true;

  @override
  void initState() {
    super.initState();

    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      Timer.periodic(const Duration(milliseconds: 50), (timer) {
        setState(() {});
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Blob Wave Animation',
      theme: ThemeData(
        brightness: Brightness.dark,
        useMaterial3: true,
      ),
      home: Scaffold(
        backgroundColor: const Color.fromARGB(255, 27, 34, 42),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const Text('Amplitude'),
              SizedBox(
                width: MediaQuery.sizeOf(context).width * 0.8,
                child: Slider(
                  value: _amplitude,
                  activeColor: Colors.blue,
                  inactiveColor: Colors.lightBlueAccent.withOpacity(0.2),
                  min: 0.0,
                  max: 8500.0,
                  onChanged: (v) {
                    setState(() {
                      _amplitude = v;
                    });
                  },
                ),
              ),
              const Text('Scale'),
              SizedBox(
                width: MediaQuery.sizeOf(context).width * 0.8,
                child: Row(
                  children: [
                    Expanded(
                      child: Slider(
                        value: _scale,
                        activeColor: Colors.blue,
                        inactiveColor: Colors.lightBlueAccent.withOpacity(0.2),
                        min: 1.0,
                        max: 1.3,
                        onChanged: (v) {
                          setState(() => _scale = v);
                        },
                      ),
                    ),
                    Checkbox(
                      value: _autoScale,
                      activeColor: Colors.blue,
                      checkColor: Colors.white,
                      onChanged: (v) {
                        setState(() {
                          _autoScale = v!;
                        });
                      },
                    ),
                    const Text('Auto'),
                  ],
                ),
              ),
              const SizedBox(height: 20.0),
              Container(
                width: MediaQuery.sizeOf(context).width * 0.8,
                height: MediaQuery.sizeOf(context).width * 0.8,
                decoration: BoxDecoration(
                  color: Colors.white12,
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: WaveBlob(
                  blobCount: 2,
                  amplitude: _amplitude,
                  scale: _scale,
                  autoScale: _autoScale,
                  centerCircle: true,
                  overCircle: true,
                  circleColors: const [
                    /// If you don't want use Gradient, set just one color
                    Colors.blue,
                  ],
                  child: const Icon(
                    Icons.mic,
                    color: Colors.white,
                    size: 50.0,
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这段代码创建了一个包含滑动条的界面,允许用户调整振幅和缩放比例,并实时更新波浪动画效果。


更多关于Flutter动态波浪效果插件wave_blob的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动态波浪效果插件wave_blob的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用wave_blob插件来实现动态波浪效果的代码示例。wave_blob是一个用于创建动态波浪动画效果的Flutter插件。

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

dependencies:
  flutter:
    sdk: flutter
  wave_blob: ^最新版本号  # 请替换为当前最新的版本号

然后运行flutter pub get来获取依赖。

接下来,你可以在你的Flutter应用中使用这个插件来创建动态波浪效果。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Wave Blob Example'),
        ),
        body: Center(
          child: WaveBlobExample(),
        ),
      ),
    );
  }
}

class WaveBlobExample extends StatefulWidget {
  @override
  _WaveBlobExampleState createState() => _WaveBlobExampleState();
}

class _WaveBlobExampleState extends State<WaveBlobExample> with SingleTickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 5),
      vsync: this,
    )..repeat(reverse: true);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 300,
      width: double.infinity,
      decoration: BoxDecoration(
        color: Colors.blueGrey.shade200,
      ),
      child: Stack(
        alignment: Alignment.center,
        children: <Widget>[
          Positioned(
            top: 50,
            left: 0,
            right: 0,
            child: WaveBlob(
              color: Colors.deepOrange,
              size: Size(double.infinity, 100),
              amplitude: 20,
              frequency: 0.05,
              offset: Offset(0, _controller.value * 100),
              speed: 0.5,
            ),
          ),
          Positioned(
            bottom: 50,
            left: 0,
            right: 0,
            child: WaveBlob(
              color: Colors.cyan,
              size: Size(double.infinity, 100),
              amplitude: 30,
              frequency: 0.03,
              offset: Offset(0, -_controller.value * 100),
              speed: -0.3,
            ),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个WaveBlobExample组件。这个组件使用了WaveBlob来创建两个波浪效果,一个在上半部分,一个在下半部分。

关键部分:

  1. AnimationController:用于控制波浪动画的进度。在这里,我们设置了一个持续时间为5秒的动画,并让它在正向和反向之间重复。

  2. WaveBlob:创建波浪效果的组件。

    • color:波浪的颜色。
    • size:波浪的大小。
    • amplitude:波浪的振幅。
    • frequency:波浪的频率。
    • offset:波浪的偏移量,这里我们将其与动画控制器的值绑定,以实现动态效果。
    • speed:波浪的移动速度。

运行这个代码,你将看到一个带有动态波浪效果的Flutter应用。你可以根据需要调整WaveBlob的参数,以实现不同的波浪效果。

回到顶部