Flutter手势缩放与点击插件flutter_scale_tap的使用

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

Flutter手势缩放与点击插件flutter_scale_tap的使用

ScaleTap 简介

ScaleTap 是一个用于Flutter的插件,它为按钮或其他小部件提供了缩放和透明度动画效果。当用户点击或长按小部件时,ScaleTap 会自动应用这些动画效果,使交互更加生动。

使用方法

1. 包含 ScaleTap 小部件

要使用 ScaleTap,您只需将需要添加手势效果的小部件包裹在 ScaleTap 中,并提供相应的回调函数。以下是一个简单的示例:

ScaleTap(
  onPressed: () {
    // 点击事件
    print("Button tapped!");
  },
  onLongPress: () {
    // 长按事件
    print("Button long pressed!");
  },
  child: Container(
    padding: EdgeInsets.all(16.0),
    decoration: BoxDecoration(
      color: Colors.blue,
      borderRadius: BorderRadius.circular(8.0),
    ),
    child: Text(
      "Tap Me",
      style: TextStyle(color: Colors.white, fontSize: 16.0),
    ),
  ),
)

2. 自定义动画效果

ScaleTap 提供了一个 ScaleTapConfig 类,允许您自定义缩放和透明度动画的效果。您可以根据需要调整以下参数:

  • scaleMinValue: 缩放的最小值,默认为 0.95
  • scaleCurve: 缩放动画的曲线,默认为 CurveSpring()
  • opacityMinValue: 透明度的最小值,默认为 0.90
  • opacityCurve: 透明度动画的曲线,默认为 Curves.ease
  • scaleOpacityAnimationDuration: 缩放和透明度动画的持续时间,默认为 300ms
  • buttonAnimationDuration: 按钮动画的持续时间,默认为 300ms

以下是一个自定义配置的示例:

class CustomScaleTapConfig {
  static double scaleMinValue = 0.90; // 调整缩放最小值
  static Curve scaleCurve = Curves.bounceInOut; // 更改缩放曲线
  static double opacityMinValue = 0.85; // 调整透明度最小值
  static Curve opacityCurve = Curves.fastOutSlowIn; // 更改透明度曲线
  static Duration scaleOpacityAnimationDuration = const Duration(milliseconds: 400); // 延长动画时间
  static Duration buttonAnimationDuration = const Duration(milliseconds: 400); // 延长按钮动画时间
}

// 使用自定义配置
ScaleTap(
  config: CustomScaleTapConfig, // 应用自定义配置
  onPressed: () {
    print("Button tapped with custom animation!");
  },
  onLongPress: () {
    print("Button long pressed with custom animation!");
  },
  child: Container(
    padding: EdgeInsets.all(16.0),
    decoration: BoxDecoration(
      color: Colors.green,
      borderRadius: BorderRadius.circular(8.0),
    ),
    child: Text(
      "Custom Tap Me",
      style: TextStyle(color: Colors.white, fontSize: 16.0),
    ),
  ),
)

完整示例Demo

以下是一个完整的示例代码,展示了如何在Flutter项目中使用 ScaleTap 插件,并应用自定义动画效果:

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

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

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ScaleTap Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 默认配置的 ScaleTap
            ScaleTap(
              onPressed: () {
                print("Default Button tapped!");
              },
              onLongPress: () {
                print("Default Button long pressed!");
              },
              child: Container(
                padding: EdgeInsets.all(16.0),
                decoration: BoxDecoration(
                  color: Colors.blue,
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: Text(
                  "Tap Me (Default)",
                  style: TextStyle(color: Colors.white, fontSize: 16.0),
                ),
              ),
            ),
            SizedBox(height: 20.0),
            // 自定义配置的 ScaleTap
            ScaleTap(
              config: CustomScaleTapConfig, // 应用自定义配置
              onPressed: () {
                print("Custom Button tapped!");
              },
              onLongPress: () {
                print("Custom Button long pressed!");
              },
              child: Container(
                padding: EdgeInsets.all(16.0),
                decoration: BoxDecoration(
                  color: Colors.green,
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: Text(
                  "Tap Me (Custom)",
                  style: TextStyle(color: Colors.white, fontSize: 16.0),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// 自定义配置类
class CustomScaleTapConfig {
  static double scaleMinValue = 0.90; // 调整缩放最小值
  static Curve scaleCurve = Curves.bounceInOut; // 更改缩放曲线
  static double opacityMinValue = 0.85; // 调整透明度最小值
  static Curve opacityCurve = Curves.fastOutSlowIn; // 更改透明度曲线
  static Duration scaleOpacityAnimationDuration = const Duration(milliseconds: 400); // 延长动画时间
  static Duration buttonAnimationDuration = const Duration(milliseconds: 400); // 延长按钮动画时间
}

更多关于Flutter手势缩放与点击插件flutter_scale_tap的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter手势缩放与点击插件flutter_scale_tap的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,flutter_scale_tap 是一个用于处理手势缩放和点击事件的插件。下面是一个示例代码,展示了如何使用这个插件来实现图片的缩放和点击功能。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_scale_tap: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的 Dart 文件中,你可以使用以下代码来实现图片的缩放和点击功能:

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

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

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

class ScaleTapWidgetExample extends StatefulWidget {
  @override
  _ScaleTapWidgetExampleState createState() => _ScaleTapWidgetExampleState();
}

class _ScaleTapWidgetExampleState extends State<ScaleTapWidgetExample> {
  double scale = 1.0;
  Offset offset = Offset.zero;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print('Image tapped!');
      },
      child: ScaleTap(
        onScaleChange: (details) {
          setState(() {
            scale = details.scale;
          });
        },
        onPanUpdate: (details) {
          setState(() {
            offset += details.delta / scale;
          });
        },
        onScaleEnd: (details) {
          // Handle end of scale gesture if needed
        },
        child: Transform.scale(
          scale: scale,
          origin: Offset.zero,
          child: Transform.translate(
            offset: offset,
            child: Image.network(
              'https://via.placeholder.com/300',
              fit: BoxFit.cover,
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的 Flutter 应用,其中包含一个可缩放和点击的图片。以下是代码的关键部分:

  1. 依赖导入:我们导入了 flutter_scale_tap 插件和 Flutter 的核心库。
  2. ScaleTapWidgetExample:这是一个有状态的 widget,它包含了一个 ScaleTap widget,用于处理缩放和拖动手势。
  3. GestureDetector:我们使用 GestureDetector 来处理点击事件。虽然 flutter_scale_tap 插件本身可以处理缩放和拖动,但点击事件需要额外的 GestureDetector
  4. ScaleTapScaleTap widget 接收三个回调参数:
    • onScaleChange:缩放手势改变时的回调。
    • onPanUpdate:拖动手势更新时的回调。
    • onScaleEnd:缩放手势结束时的回调(可选)。
  5. Transform:我们使用 Transform.scaleTransform.translate 来应用缩放和拖动变换。

请注意,flutter_scale_tap 插件的具体 API 可能会随着版本更新而变化,因此请查阅最新的文档以获取最准确的信息。如果插件没有直接提供 onScaleChangeonPanUpdate 等回调,你可能需要使用其他方法来处理这些手势。

回到顶部