搜索插件、代码仓与 APP 分类

pinch_zoom_release_unzoom 封面
插件详情v2.0.0

pinch_zoom_release_unzoom

一个用于实现双指缩放的 Widget,缩放结束后会恢复到原始大小。其效果与 Instagram 中图片缩放的方式非常相似。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
4140
喜欢数
65
Pub 分数
160

安装插件

flutter pub add pinch_zoom_release_unzoom

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

一个 Flutter 小部件,可实现捏合缩放功能,在手势结束后自动恢复到原始大小,模仿 Instagram 的图片缩放行为。它提供平滑的临时缩放效果,非常适合不需要保持放大状态的图片或内容。该小部件支持所有主要平台,包括 Android、iOS、Web、macOS、Windows 和 Linux,适用于跨平台应用。它轻量且易于集成,配置简单。

适合场景

  • 临时缩放的图像查看
  • 具有动态缩放的交互式 UI 元素
  • 跨平台基于手势的内容探索
  • 增强照片画廊的用户体验
  • 简单的缩放效果,无持续缩放

主要特点

  • 捏合后自动返回原始大小
  • 缩放和反缩放过程中的平滑动画
  • 支持所有主要的Flutter平台
  • 所需设置最少
  • 直观的手势识别

适合对象

  • 开发图像密集型应用的开发者
  • 需要临时缩放交互的应用
  • 旨在实现类似 Instagram 操作手势的项目
  • 寻求直观触摸反馈的UI设计师
  • 具有手势需求的跨平台应用

使用建议

  • 不适用于持续缩放状态
  • 缩放行为的自定义选项有限
  • 可能需要额外处理复杂布局
  • 最好与静态或非滚动内容一起使用
  • 性能可能因大尺寸或高分辨率图像而有所不同

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

pub package popularity likes pub points

This package helps to create an instagram like zoom picture. With pinch to zoom and release to unzoom

In this video I explained how to use pinch to zoom, in a flutter project

https://youtu.be/V2DglEpynF8

Zoom_demo

Features

Let's your app show zoomable images in an user friendly way.

It's a container of an uncliped interactive viewer that let's the user zoom the image occupying the entire screen. Once you release the screen and stop the pinch interaction the image/widget will come back to it's original size in an smooth animation.

Getting started

Add the dependency to your pubspec.yaml:

pinch_zoom_release_unzoom: ^1.0.1

Usage


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

Additional information

This package also support some extra params that may be useful depending on what are you trying to achieve

PinchZoomReleaseUnzoomWidget(
    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
)

Making it work well inside a scroll

I made a video explaining how to solve the pinch to zoom inside a scroll:

https://youtu.be/FUuCOdQerpw

The problem with making a pinch working inside a scroll is that the drag of a screen, as a simple gesture that can be done with just one finger, tends to override the more complex scale gesture that needs two fingers to work well, the best way I found to overcome that challenge is to change the physics of the scroll to NeverScrollableScrollPhysics() when the second finger touch the screen, that way the scroll stops to override the scale gesture and it's easy to interact with the interactive viewer.

Another consideration that you will need to have is that to avoid losing frames of the reset animation, you need to delay the setState that will bring the scroll back to the parent widget

So the scroll build will look like this:

  bool blockScroll = false;
ScrollController controller = ScrollController();

@override
Widget build(BuildContext context) {
  return SingleChildScrollView(
      controller: controller,
      physics: blockScroll ? NeverScrollableScrollPhysics() : ScrollPhysics(),

And the PinchWidget will have this two extra parameters:

twoFingersOn: () => setState(() => blockScroll = true),
twoFingersOff: () => Future.delayed(
PinchZoomReleaseUnzoomWidget.defaultResetDuration,
() => setState(() => blockScroll = false),

For a complete widget example check this one:

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

  @override
  State<TestSimpleScroll> createState() => _TestSimpleScrollState();
}

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

  @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: PinchZoomReleaseUnzoomWidget(
                  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(
                    PinchZoomReleaseUnzoomWidget.defaultResetDuration,
                        () => setState(() => blockScroll = false),
                  ),
                ),
              ),
              const SizedBox(
                height: 5000,
              )
            ],
          ),
        ),
      ),
    );
  }
}

Simulator test

To test in a simulator add a fingersRequiredToPinch to pinch with a -1 to disable the requirement of two fingers to start an interaction

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

Like us on pub.dev

Package url: https://pub.dev/packages/pinch_zoom_release_unzoom

所属分类

源码仓库

使用此插件的项目

暂无相关数据。