Flutter自定义缩放功能插件custom_zoom_widget的使用

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

Flutter自定义缩放功能插件custom_zoom_widget的使用

功能

custom_zoom_widget 是一个用于在可滚动屏幕中显示可缩放图片的自定义组件。它允许用户以友好的方式缩放图片,当用户释放屏幕并停止捏合手势时,图片会平滑地恢复到原始大小。

使用方法

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 custom_zoom_widget 依赖:

dependencies:
  custom_zoom_widget: ^0.0.1

2. 基本用法

以下是一个简单的示例,展示如何使用 CustomZoomWidget 来显示一张网络图片:

CustomZoomWidget(
  child: Image.network(
    'https://storage.googleapis.com/cms-storage-bucket/70760bf1e88b184bb1bc.png'
  ),
)

3. 高级参数

CustomZoomWidget 还支持一些额外的参数,以便根据需求进行更精细的控制。例如:

CustomZoomWidget(
  child: Image.network('https://storage.googleapis.com/cms-storage-bucket/70760bf1e88b184bb1bc.png'),
  minScale: 0.8, // 最小缩放比例
  maxScale: 4,   // 最大缩放比例
  resetDuration: const Duration(milliseconds: 200), // 恢复动画持续时间
  boundaryMargin: const EdgeInsets.only(bottom: 0), // 边界边距
  clipBehavior: Clip.none, // 是否裁剪内容
  useOverlay: true, // 是否使用遮罩层
  maxOverlayOpacity: 0.5, // 遮罩层最大透明度
  overlayColor: Colors.black, // 遮罩层颜色
  fingersRequiredToPinch: 2, // 需要的手指数量来触发捏合手势
)

4. 在可滚动视图中使用

在可滚动视图(如 SingleChildScrollView)中使用 CustomZoomWidget 时,可能会遇到一个问题:单指拖动会覆盖双指缩放手势。为了解决这个问题,可以在检测到第二个手指触摸屏幕时,将滚动物理属性设置为 NeverScrollableScrollPhysics,从而禁用滚动,使缩放手势优先。

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

  [@override](/user/override)
  State<TestSimpleScroll> createState() => _TestSimpleScrollState();
}

class _TestSimpleScrollState extends State<TestSimpleScroll> {
  bool blockScroll = false;
  ScrollController controller = ScrollController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      controller: controller,
      physics: blockScroll ? NeverScrollableScrollPhysics() : ScrollPhysics(),
      child: SizedBox(
        width: MediaQuery.of(context).size.width,
        child: Container(
          padding: const EdgeInsets.all(20),
          child: Column(
            children: [
              SizedBox(
                width: 300,
                height: 250,
                child: CustomZoomWidget(
                  child: Image.network(
                    'https://www.animalfriends.co.uk/siteassets/media/images/article-images/cat-articles/38_afi_article1_caring-for-a-kitten-tips-for-the-first-month.png',
                  ),
                  twoFingersOn: () => setState(() => blockScroll = true), // 当两个手指触摸屏幕时,禁用滚动
                  twoFingersOff: () => Future.delayed(
                    CustomZoomWidget.defaultResetDuration,
                    () => setState(() => blockScroll = false), // 延迟恢复滚动
                  ),
                ),
              ),
              const SizedBox(height: 5000,), // 模拟长内容
            ],
          ),
        ),
      ),
    );
  }
}

5. 模拟器测试

在模拟器中测试时,可以通过设置 fingersRequiredToPinch: -1 来禁用对手指数量的要求,方便测试缩放功能:

CustomZoomWidget(
  child: Image.network('https://storage.googleapis.com/cms-storage-bucket/70760bf1e88b184bb1bc.png'),
  fingersRequiredToPinch: -1, // 禁用手指数量要求
)

完整示例代码

以下是一个完整的示例代码,展示了如何在一个可滚动页面中使用 CustomZoomWidget

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Custom Zoom Widget Example')),
        body: TestSimpleScroll(),
      ),
    );
  }
}

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

  [@override](/user/override)
  State<TestSimpleScroll> createState() => _TestSimpleScrollState();
}

class _TestSimpleScrollState extends State<TestSimpleScroll> {
  bool blockScroll = false;
  ScrollController controller = ScrollController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      controller: controller,
      physics: blockScroll ? NeverScrollableScrollPhysics() : ScrollPhysics(),
      child: SizedBox(
        width: MediaQuery.of(context).size.width,
        child: Container(
          padding: const EdgeInsets.all(20),
          child: Column(
            children: [
              SizedBox(
                width: 300,
                height: 250,
                child: CustomZoomWidget(
                  child: Image.network(
                    'https://www.animalfriends.co.uk/siteassets/media/images/article-images/cat-articles/38_afi_article1_caring-for-a-kitten-tips-for-the-first-month.png',
                  ),
                  twoFingersOn: () => setState(() => blockScroll = true), // 当两个手指触摸屏幕时,禁用滚动
                  twoFingersOff: () => Future.delayed(
                    CustomZoomWidget.defaultResetDuration,
                    () => setState(() => blockScroll = false), // 延迟恢复滚动
                  ),
                  minScale: 0.8, // 最小缩放比例
                  maxScale: 4,   // 最大缩放比例
                  resetDuration: const Duration(milliseconds: 200), // 恢复动画持续时间
                  boundaryMargin: const EdgeInsets.only(bottom: 0), // 边界边距
                  clipBehavior: Clip.none, // 是否裁剪内容
                  useOverlay: true, // 是否使用遮罩层
                  maxOverlayOpacity: 0.5, // 遮罩层最大透明度
                  overlayColor: Colors.black, // 遮罩层颜色
                  fingersRequiredToPinch: 2, // 需要的手指数量来触发捏合手势
                ),
              ),
              const SizedBox(height: 5000,), // 模拟长内容
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter自定义缩放功能插件custom_zoom_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义缩放功能插件custom_zoom_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用custom_zoom_widget插件来实现自定义缩放功能的代码示例。假设你已经将custom_zoom_widget添加到了你的pubspec.yaml文件中。

首先,确保你的pubspec.yaml包含以下依赖项:

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

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

以下是一个简单的示例代码,展示如何使用custom_zoom_widget

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Custom Zoom Widget Example'),
        ),
        body: Center(
          child: CustomZoomWidget(
            // 被缩放的内容
            child: Image.network(
              'https://via.placeholder.com/600x400',
              fit: BoxFit.cover,
            ),
            // 最大缩放比例
            maxZoom: 5.0,
            // 最小缩放比例
            minZoom: 1.0,
            // 初始缩放比例
            initialZoom: 1.0,
            // 是否允许双击缩放
            enableDoubleTapZoom: true,
            // 双击缩放的比例
            doubleTapZoomScale: 2.0,
            // 是否显示缩放控制器(手势控制条)
            showZoomController: true,
            // 缩放控制器的背景颜色
            zoomControllerBackgroundColor: Colors.black54,
            // 缩放控制器的边框颜色
            zoomControllerBorderColor: Colors.white,
            // 缩放控制器的宽度
            zoomControllerWidth: 50.0,
            // 缩放控制器的高度
            zoomControllerHeight: 50.0,
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个使用CustomZoomWidget包裹的图像。CustomZoomWidget接受多个参数来配置缩放行为,包括:

  • child:被缩放的内容,这里是一个网络图片。
  • maxZoom:最大缩放比例。
  • minZoom:最小缩放比例。
  • initialZoom:初始缩放比例。
  • enableDoubleTapZoom:是否允许双击缩放。
  • doubleTapZoomScale:双击缩放的比例。
  • showZoomController:是否显示缩放控制器(手势控制条)。
  • zoomControllerBackgroundColor:缩放控制器的背景颜色。
  • zoomControllerBorderColor:缩放控制器的边框颜色。
  • zoomControllerWidthzoomControllerHeight:缩放控制器的宽度和高度。

这个示例展示了如何快速集成并使用custom_zoom_widget插件来实现自定义缩放功能。你可以根据实际需求调整这些参数。

回到顶部