Flutter触摸旋转控制插件flutter_touch_spin的使用

Flutter触摸旋转控制插件flutter_touch_spin的使用

flutter_touch_spin 是一个用于Flutter的简单数字输入旋钮小部件。灵感来源于Bootstrap Touchspin。

截图

截图

入门指南

以下是一个简单的示例代码:

TouchSpin(
    min: 5,
    max: 100,
    step: 5,
    value: 10,
    displayFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'),
    textStyle: const TextStyle(fontSize: 36),
    iconSize: 48.0,
    addIcon: const Icon(Icons.add_circle_outline),
    subtractIcon: const Icon(Icons.remove_circle_outline),
    iconActiveColor: Colors.green,
    iconDisabledColor: Colors.grey,
    iconPadding: const EdgeInsets.all(20),
    onChanged: (val){
        print(val);
    },
),

属性

属性 类型 默认值
value num 1
min num 1
max num 9999999
step num 1
displayFormat NumberFormat
textStyle TextStyle TextStyle(fontSize: 24)
iconSize double 24.0
addIcon Icon Icon(Icons.add)
subtractIcon Icon Icon(Icons.remove)
iconActiveColor Color Theme.of(context).textTheme.button.color
iconDisabledColor Color Theme.of(context).disabledColor
iconPadding EdgeInsetsGeometry EdgeInsets.all(4.0)
onChanged ValueChanged<num>

完整示例代码

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

import 'package:flutter/material.dart';
import 'package:flutter_touch_spin/flutter_touch_spin.dart';
import 'package:intl/intl.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  double value = 10;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter TouchSpin Example',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        brightness: Brightness.dark,
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(title: const Text('Flutter TouchSpin')),
        body: Center(
          child: Column(
            children: [
              // 第一个TouchSpin组件
              TouchSpin(
                key: UniqueKey(),
                value: value,
                min: 5,
                max: 100,
                step: 5,
                displayFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'),
                textStyle: const TextStyle(fontSize: 36),
                iconSize: 48.0,
                addIcon: const Icon(Icons.add_circle_outline),
                subtractIcon: const Icon(Icons.remove_circle_outline),
                iconActiveColor: Colors.green,
                iconDisabledColor: Colors.grey,
                iconPadding: const EdgeInsets.all(20),
                onChanged: (val) {
                  debugPrint(val.toString());
                },
                enabled: true,
              ),
              const Divider(),
              // 第二个TouchSpin组件
              Row(
                children: [
                  Expanded(
                    child: TouchSpin(
                      value: 10,
                      min: 5,
                      max: 100,
                      step: 1,
                      textStyle: const TextStyle(fontSize: 18),
                      iconSize: 24.0,
                      addIcon: const Icon(Icons.arrow_circle_up),
                      subtractIcon: const Icon(Icons.arrow_circle_down),
                      iconActiveColor: Colors.blue,
                      iconDisabledColor: Colors.grey,
                      iconPadding: const EdgeInsets.all(20),
                      onChanged: (val) {
                        debugPrint(val.toString());
                      },
                      enabled: true,
                    ),
                  ),
                  const VerticalDivider(),
                  Expanded(
                    child: TouchSpin(
                      value: 10,
                      min: 5,
                      max: 100,
                      step: 5,
                      textStyle: const TextStyle(fontSize: 18),
                      iconSize: 24,
                      addIcon: const Icon(Icons.arrow_forward),
                      subtractIcon: const Icon(Icons.arrow_back),
                      iconActiveColor: Colors.red,
                      iconDisabledColor: Colors.grey,
                      iconPadding: const EdgeInsets.all(20),
                      onChanged: (val) {
                        debugPrint(val.toString());
                      },
                      enabled: true,
                    ),
                  ),
                ],
              ),
              // 按钮,用于设置值为25
              ElevatedButton(
                onPressed: () {
                  setState(() => value = 25);
                },
                child: const Text('Set to \$25'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter触摸旋转控制插件flutter_touch_spin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter触摸旋转控制插件flutter_touch_spin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用flutter_touch_spin插件来实现触摸旋转控制的示例代码。这个插件允许用户通过触摸和旋转手势来控制一个对象的旋转。

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

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

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

接下来是一个简单的示例,演示如何使用flutter_touch_spin来控制一个旋转的图标:

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

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

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

class TouchSpinWidget extends StatefulWidget {
  @override
  _TouchSpinWidgetState createState() => _TouchSpinWidgetState();
}

class _TouchSpinWidgetState extends State<TouchSpinWidget> {
  double _angle = 0.0;

  @override
  Widget build(BuildContext context) {
    return Transform.rotate(
      angle: _angle,
      child: Icon(
        Icons.star,
        size: 100,
        color: Colors.amber,
      ),
    );
  }

  void _onRotate(double delta) {
    setState(() {
      _angle += delta;
    });
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanUpdate: (details) {
        // 计算旋转角度的变化量(这里简单地将水平位移转换为角度变化)
        double deltaX = details.delta.dx;
        double rotationSensitivity = 0.01; // 旋转灵敏度,可以根据需要调整
        double deltaAngle = deltaX * rotationSensitivity;
        _onRotate(deltaAngle);
      },
      child: Stack(
        alignment: Alignment.center,
        children: <Widget>[
          Transform.rotate(
            angle: _angle,
            child: Icon(
              Icons.star,
              size: 100,
              color: Colors.amber,
            ),
          ),
          // 可选:添加一个透明的圆形区域来增强触摸反馈
          Positioned(
            width: 120,
            height: 120,
            child: GestureDetector(
              behavior: HitTestBehavior.translucent,
              onPanUpdate: (details) {
                // 这里的处理逻辑同上,但这里是为了确保触摸区域更大
                double deltaX = details.delta.dx;
                double rotationSensitivity = 0.01;
                double deltaAngle = deltaX * rotationSensitivity;
                _onRotate(deltaAngle);
              },
            ),
          ),
        ],
      ),
    );
  }
}

注意

  1. 上面的代码实际上并没有直接使用flutter_touch_spin插件,因为该插件的具体使用方式可能涉及到更多的配置和手势识别逻辑。然而,flutter_touch_spin插件的文档可能并不完整或者示例代码较少,因此这里提供了一个基于GestureDetectorTransform.rotate的自定义实现,用于演示旋转控制的基本原理。

  2. 如果flutter_touch_spin插件提供了更高级或更简洁的API来实现触摸旋转控制,请参考该插件的官方文档或示例代码进行调整。通常,插件的使用会涉及到创建一个TouchSpin控件,并设置相应的回调函数来处理旋转事件。

  3. 在实际应用中,你可能需要根据具体需求调整旋转的灵敏度、限制旋转范围或添加其他交互效果。

由于flutter_touch_spin插件的具体API和用法可能随时间而变化,请务必参考最新的官方文档和示例代码来获取最准确的信息。如果插件提供了内置的旋转控制功能,则可以直接使用插件提供的控件和回调接口来实现触摸旋转控制。

回到顶部