Flutter圆形选择器插件circle_wheel的使用

Flutter圆形选择器插件circle_wheel的使用

圆形选择器插件circle_wheel简介

Flutter에서 아름답고 상호작용이 가능한 방사형 레이아웃을 부드러운 360도 회전으로 구현할 수 있는 유연한 원형 휠 위젯입니다.




示例



特点

丰富的旋转控制

  • 支持手势的平滑360度旋转
  • 可自定义的旋转阻力和动画曲线
  • 可选的反弹效果

智能热点系统

  • 定义单个或多个热点位置
  • 热点处动态的项目缩放
  • 可自定义的热点角度和范围

灵活的样式

  • 支持任何类型的widget作为项目
  • 动态缩放和动画
  • 灵活的布局选项(完整的圆或部分圆)

性能优化

  • 可选的基于可见性的渲染
  • 平滑的动画和过渡

访问性支持

  • 支持语义标签
  • 可选的触觉反馈
  • 可配置的交互模式

平台支持

平台 支持
Android
iOS
Web
Windows
macOS
Linux

要求

  • Dart SDK: ^3.5.4
  • Flutter: >=1.17.0
  • Android: minSdkVersion 16
  • iOS: iOS 11.0 or higher
  • Web: 所有现代浏览器
  • 桌面: Windows 10+, macOS 10.14+, Linux (GTK 3.x)

安装

pubspec.yaml 文件中添加 circle_wheel

dependencies:
  circle_wheel: 0.0.1+2

基本用法

import 'package:circle_wheel/circle_wheel.dart';

CircleWheel(
  radius: 150, // 轮子半径
  itemCount: 8, // 项目数量
  itemBuilder: (index, isAtHotspot) { // 项目构建器
    return Icon(
      Icons.star, // 星星图标
      size: isAtHotspot ? 32 : 24, // 热点时放大
      color: isAtHotspot ? Colors.amber : Colors.grey, // 热点时颜色变化
    );
  },
)

高级用法

交互式菜单

CircleWheel(
  radius: 150, // 轮子半径
  itemCount: 6, // 项目数量
  snapToHotspot: true, // 吸附到热点
  hotspotScale: 1.2, // 热点缩放比例
  onItemSelected: (index) { // 项目选择回调
    // 处理项目选择
  },
  itemBuilder: (index, isAtHotspot) { // 项目构建器
    return MenuOption(
      icon: menuIcons[index], // 图标
      label: menuLabels[index], // 标签
      isSelected: isAtHotspot, // 是否为热点
    );
  },
)

自动旋转显示

CircleWheel(
  radius: 180, // 轮子半径
  itemCount: 12, // 项目数量
  autoRotate: true, // 自动旋转
  autoRotateSpeed: 0.5, // 自动旋转速度
  itemBuilder: (index, isAtHotspot) { // 项目构建器
    return AnimatedContainer(
      duration: Duration(milliseconds: 200), // 动画持续时间
      width: isAtHotspot ? 100 : 80, // 热点时放大
      height: isAtHotspot ? 100 : 80, // 热点时放大
      child: YourCustomWidget(), // 自定义widget
    );
  },
)

自定义

主要选项

动画选项
  • rotationDuration: 旋转动画持续时间
  • rotationCurve: 旋转动画曲线
  • hotspotTransitionDuration: 热点过渡持续时间
  • autoRotate: 开启自动旋转
  • autoRotateSpeed: 自动旋转速度
布局选项
  • radius: 轮子半径
  • startAngle: 轮子起始角度
  • endAngle: 部分轮子的结束角度(可选)
  • innerRadius: 环形布局的内半径(可选)
交互选项
  • snapToHotspot: 开启吸附到热点
  • rotationResistance: 控制旋转灵敏度
  • bounceBack: 开启反弹效果
  • multipleHotspots: 定义多个热点位置

示例代码

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

import 'package:example/MusicPlayerExample.dart';
import 'package:example/StepCounterExample.dart';
import 'package:example/TodoListExample.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'CircleWheel Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('CircleWheel Examples'),
      ),
      body: ListView(
        children: [
          ListTile(
            title: const Text('Music Player'),
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => const MusicPlayerExample()),
              );
            },
          ),
          ListTile(
            title: const Text('Scheduler'),
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => const TodoListExample()),
              );
            },
          ),
          ListTile(
            title: const Text('Step Counter'),
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => const StepCounterExample()),
              );
            },
          ),
        ],
      ),
    );
  }
}

更多关于Flutter圆形选择器插件circle_wheel的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter圆形选择器插件circle_wheel的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用circle_wheel插件来实现圆形选择器的示例代码。circle_wheel插件允许你创建一个圆形的选择器,这在很多应用场景中都非常有用,比如选择日期、时间或者任何需要圆形导航的数据。

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

dependencies:
  flutter:
    sdk: flutter
  circle_wheel: ^latest_version  # 请替换为最新的版本号

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

接下来,我们可以创建一个简单的Flutter应用来使用circle_wheel。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Circle Wheel Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<String> items = List.generate(12, (index) => 'Item $index');
  int selectedIndex = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Circle Wheel Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(
              child: Center(
                child: CircleWheel(
                  items: items,
                  selectedIndex: selectedIndex,
                  onSelectedItemChanged: (index) {
                    setState(() {
                      selectedIndex = index;
                    });
                  },
                  itemWidgetBuilder: (context, index) {
                    return Container(
                      alignment: Alignment.center,
                      child: Text(
                        items[index],
                        style: TextStyle(fontSize: 20, color: Colors.white),
                      ),
                      decoration: BoxDecoration(
                        shape: BoxShape.circle,
                        color: index == selectedIndex ? Colors.blue : Colors.grey,
                      ),
                    );
                  },
                ),
              ),
            ),
            SizedBox(height: 20),
            Text(
              'Selected Item: ${items[selectedIndex]}',
              style: TextStyle(fontSize: 20),
            ),
          ],
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖添加:确保在pubspec.yaml中添加了circle_wheel依赖。
  2. 数据准备:在MyHomePage类中,我们准备了一个包含12个字符串的列表items,用于显示在圆形选择器中。
  3. UI构建
    • 使用Scaffold作为主布局。
    • body中,使用Column布局来垂直排列圆形选择器和选中的项目文本。
    • CircleWheel组件用于显示圆形选择器。
      • items属性设置显示的项目列表。
      • selectedIndex属性设置当前选中的项目索引。
      • onSelectedItemChanged回调用于处理项目选择变化。
      • itemWidgetBuilder用于自定义每个项目的显示样式。
  4. 选中项目显示:在Column布局下方,使用Text组件显示当前选中的项目。

运行这个示例代码,你将看到一个简单的圆形选择器,每个项目都是一个可点击的圆,当你点击某个项目时,它会变成蓝色并更新下方的文本显示。

这个示例应该能够帮助你理解如何在Flutter中使用circle_wheel插件来实现圆形选择器。你可以根据需要进一步自定义和扩展这个示例。

回到顶部