Flutter图片合成插件oval_image_combiner的使用

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

Flutter图片合成插件oval_image_combiner的使用

简介

Oval Image Combiner 是一个Flutter小部件,允许你将最多四张图片组合成椭圆形。该插件支持栅格图像和SVG图像,并且可以自定义图片大小、边框和分隔线。

示例图片

功能特性

  • 支持将1到4张图片组合成椭圆形。
  • 支持栅格图像和SVG图像。
  • 可自定义图片大小。
  • 可自定义边框和分隔线。

开始使用

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  oval_image_combiner: ^[LATEST_VERSION]
使用

导入插件:

import 'package:oval_image_combiner/oval_image_combiner.dart';

使用 OvalImageCombiner 小部件:

OvalImageCombiner(
  borderColor: Colors.grey,          // 边框颜色
  borderWidth: 2,                    // 边框宽度
  dividerColor: Colors.grey,         // 分隔线颜色
  dividerThickness: 2,               // 分隔线厚度
  imageUrls: [
    'https://example.com/image1.png', // 图片URL
    'https://example.com/image2.png', // 图片URL
    // 最多可以添加4个图片URL
  ],
  imageSize: 60,                     // 图片大小
)

完整示例Demo

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 OvalImageCombiner 插件:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Oval Image Combiner Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Oval Image Combiner Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text('Combined Images:'),
            const SizedBox(height: 20),
            // 单张图片
            OvalImageCombiner(
              borderColor: Colors.grey.shade100, // 边框颜色
              borderWidth: 2,                     // 边框宽度
              imageUrls: [
                'https://github.com/tommykw/oval_image_combiner/blob/main/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png?raw=true',
              ],
              imageSize: 100, // 图片大小
            ),
            const SizedBox(height: 20),
            // 两张图片
            OvalImageCombiner(
              borderColor: Colors.grey.shade100, // 边框颜色
              borderWidth: 2,                     // 边框宽度
              imageUrls: [
                'https://raw.githubusercontent.com/tommykw/oval_image_combiner/0545c8914db2f2d596b71491ea5d66c2c1217c4b/asset/search_black.svg',
                'https://github.com/tommykw/oval_image_combiner/blob/main/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png?raw=true',
              ],
              imageSize: 100, // 图片大小
            ),
            const SizedBox(height: 20),
            // 三张图片
            OvalImageCombiner(
              imageUrls: [
                'https://github.com/tommykw/oval_image_combiner/blob/main/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png?raw=true',
                'https://raw.githubusercontent.com/tommykw/oval_image_combiner/0545c8914db2f2d596b71491ea5d66c2c1217c4b/asset/search_black.svg',
                'https://github.com/tommykw/oval_image_combiner/blob/main/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png?raw=true',
              ],
              imageSize: 100, // 图片大小
            ),
            const SizedBox(height: 20),
            // 四张图片
            OvalImageCombiner(
              dividerColor: Colors.grey.shade300, // 分隔线颜色
              dividerThickness: 2,                // 分隔线厚度
              imageUrls: [
                'https://github.com/tommykw/oval_image_combiner/blob/main/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png?raw=true',
                'https://raw.githubusercontent.com/tommykw/oval_image_combiner/0545c8914db2f2d596b71491ea5d66c2c1217c4b/asset/search_black.svg',
                'https://github.com/tommykw/oval_image_combiner/blob/main/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png?raw=true',
                'https://raw.githubusercontent.com/tommykw/oval_image_combiner/0545c8914db2f2d596b71491ea5d66c2c1217c4b/asset/search_black.svg',
              ],
              imageSize: 100, // 图片大小
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter图片合成插件oval_image_combiner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图片合成插件oval_image_combiner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 oval_image_combiner Flutter 插件的示例代码。这个插件允许你在 Flutter 应用中合成带有圆形或椭圆形边框的图片。

首先,你需要在你的 pubspec.yaml 文件中添加 oval_image_combiner 依赖:

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

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

接下来,在你的 Dart 文件中,你可以使用 OvalImageCombiner 来合成图片。以下是一个完整的示例:

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

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

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

class OvalImageCombinerExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 定义背景图片和前景图片
    final backgroundImage = NetworkImage('https://example.com/background.jpg');
    final foregroundImage = NetworkImage('https://example.com/foreground.png');

    // 定义合成参数
    final combinerOptions = OvalImageCombinerOptions(
      backgroundImage: backgroundImage,
      foregroundImage: foregroundImage,
      ovalOptions: OvalOptions(
        ovalShape: OvalShape.circle, // 可以是 OvalShape.oval 用于椭圆形
        ovalSize: Size(200, 200), // 设置合成图片的大小
        ovalPosition: Offset(50, 50), // 设置合成图片在背景图片中的位置
        borderRadius: 50.0, // 仅在OvalShape.oval时有效,用于设置椭圆的圆角
        border: Border.all(color: Colors.white, width: 4.0), // 设置边框
      ),
    );

    return OvalImageCombiner(
      options: combinerOptions,
    );
  }
}

// NetworkImage 是一个简单的包装类,用于从网络加载图片
class NetworkImage extends StatefulWidget {
  final String url;

  NetworkImage(this.url);

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

class _NetworkImageState extends State<NetworkImage> {
  late ImageProvider _imageProvider;

  @override
  void initState() {
    super.initState();
    _imageProvider = NetworkImageWithRetry(widget.url);
  }

  @override
  Widget build(BuildContext context) {
    return Image.network(widget.url); // 这里只是为了演示,实际应使用 _imageProvider
  }
}

// NetworkImageWithRetry 是一个简单的包装类,用于处理图片加载失败的重试
class NetworkImageWithRetry extends ImageProvider {
  final String url;

  NetworkImageWithRetry(this.url);

  @override
  ImageStreamCompleter load(Key key) {
    final completer = MultiFrameImageStreamCompleter(
      codec: _loadAsync(url),
      scale: 1.0,
    );

    return completer;
  }

  Future<Codec> _loadAsync(String url) async {
    try {
      final data = await NetworkAssetBundle(Uri.parse(url)).load(url);
      return instantiateImageCodec(data.buffer.asUint8List());
    } catch (_) {
      // 可以在这里添加重试逻辑
      rethrow;
    }
  }

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is NetworkImageWithRetry &&
          runtimeType == other.runtimeType &&
          url == other.url;

  @override
  int get hashCode => url.hashCode;
}

注意:

  1. NetworkImageNetworkImageWithRetry 类是示例代码中的辅助类,用于从网络加载图片。在实际应用中,你可能不需要这么复杂的处理,直接使用 Image.network 即可。
  2. OvalImageCombinerOptions 中的 ovalPosition 是基于背景图片的左上角来定位的。
  3. 插件可能会更新其 API,所以请务必参考最新的插件文档和示例代码。

这个示例展示了如何使用 oval_image_combiner 插件将前景图片合成到背景图片上,并应用圆形或椭圆形边框。希望这对你有所帮助!

回到顶部