美文网首页
flutter 丝滑的卡尺时间选择器(带裁剪器)

flutter 丝滑的卡尺时间选择器(带裁剪器)

作者: huisedediao | 来源:发表于2024-01-24 22:16 被阅读0次

可能是你用过最丝滑的卡尺时间选择器

xb_time_ruler.gif

安装

flutter pub add xb_time_ruler

使用

import 'dart:async';

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final GlobalKey<XBTimeRulerPlaybackState> _globalKey = GlobalKey();

  final int _alpha = 80;

  late final List<XBTimeRulerArea> _areas;

  @override
  void initState() {
    super.initState();
    _areas = [
      XBTimeRulerArea(
          startOffsetPercent: 0.1,
          endOffsetPercent: 0.2,
          color: Colors.blue.withAlpha(_alpha)),
      XBTimeRulerArea(
          startOffsetPercent: 0.4,
          endOffsetPercent: 0.6,
          color: Colors.blue.withAlpha(_alpha)),
      XBTimeRulerArea(
          startOffsetPercent: 0.7,
          endOffsetPercent: 1.0,
          color: Colors.red.withAlpha(_alpha))
    ];
  }

  bool isInAvailable(double value) {
    bool ret = false;
    for (var element in _areas) {
      if (element.isAvailable && element.isInSide(value)) {
        ret = true;
        break;
      }
    }
    return ret;
  }

  XBTimeRulerArea? findFirstAvailable() {
    for (var element in _areas) {
      if (element.isAvailable) {
        return element;
      }
    }
    return null;
  }

  int fingers = 0;

  Timer? delayTimer;

  double? percent;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text(''),
        ),
        body: Center(
            child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            XBTimeRulerPlayback(
                needCropper: true,
                initCropperStartPercent: 0.15,
                initCropperEndPercent: 0.22,
                // coverLeftImg: "assets/images/arrow_left.png",
                // coverRightImg: "assets/images/arrow_right.png",
                key: _globalKey,
                initOffsetPercent: 0.2,
                onChanged: (value) {
                  // print("百分比更新:$value");
                  percent = value;
                },
                onScrollEnd: (value) {
                  percent = value;
                  scrollIfNeed();
                },
                onFingersChange: (value) {
                  fingers = value;
                  if (fingers != 0) {
                    delayTimer?.cancel();
                  } else {
                    scrollIfNeed();
                  }
                },
                areas: _areas),
            const SizedBox(
              height: 40,
            ),
            GestureDetector(
                onTap: () {
                  print(_globalKey.currentState?.coverPercentRange);
                },
                child: const Padding(
                  padding: EdgeInsets.all(8.0),
                  child: Text("获取百分比"),
                ))
          ],
        )),
      ),
    );
  }

  scrollIfNeed() {
    if (percent == null) return;
    final available = isInAvailable(percent!);
    if (!available) {
      final first = findFirstAvailable();
      if (first != null) {
        delayTimer?.cancel(); // 取消上一个计时器
        delayTimer = Timer(const Duration(milliseconds: 1000), () {
          if (fingers == 0) {
            _globalKey.currentState
                ?.updatedOffsetPercent(first.startOffsetPercent);
          }
        });
      }
    }
  }

  @override
  void dispose() {
    delayTimer?.cancel();
    super.dispose();
  }
}

相关文章

  • flutter常用插件

    Flutter 常用插件 1、时间选择器 flutter_datetime_picker 2、toast flut...

  • 前端组件

    特效 datedropper日期选择器 timedropper时间选择器 slideout侧滑框架 CSS3 Po...

  • 仿微信图片选择

    Android图片选择器,仿微信的图片选择器的样式和效果。支持图片单选、多选、裁剪形状自定义、裁剪比例设置、解耦图...

  • 网址记录

    图片选择器Android的图像裁剪库SmartRefreshLayout刷新加载Android MVP 快速集成框...

  • Flutter时间/日期选择器

    效果图:

  • flutter时间滚轮选择器

    在做Flutter项目时,有一个需求是实现一个可以选择开始时间和结束时间的时间选择器(时间选择范围为当前手机时间往...

  • 自定义卡尺选择器

    前言 由于某个项目需要,就写了这个东西。大家看看有需求的直接拿走。 效果 1.支持拖动,支持点击 2.可定制的属性...

  • 第三方库之 PictureSelector

    一款针对 Android 平台下的图片选择器,支持从相册获取图片、视频、音频&拍照,支持裁剪(单图 or 多图裁剪...

  • Flutter从新建文件夹开始

    Flutter环境配置 Flutter升级3.0后,马不停蹄又把flutter下载下来了,写了个小东西,丝滑的体验...

  • Android 拍照、从相册选择图片之PictureSelect

    仿微信实现在Android平台下的图片选择器,支持从相册获取图片、视频、音频&拍照,支持裁剪(单图or多图裁剪)、...

网友评论

      本文标题:flutter 丝滑的卡尺时间选择器(带裁剪器)

      本文链接:https://www.haomeiwen.com/subject/vzvmodtx.html