Flutter动画输入框边框插件animated_input_border的使用

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

Flutter动画输入框边框插件animated_input_border的使用

AnimatedInputBorder 是一个用于 Flutter 的包,可以为文本字段提供可自定义的动画边框。该插件通过用户交互(例如聚焦或输入变化)来实现平滑过渡效果,从而增强用户界面设计。

关键特性

  • 当文本字段获得或失去焦点时,边框可以进行动画。
  • 可以自定义边框半径、宽度和颜色。
  • 支持间隙填充,以便适应浮动标签或缺口。
  • 使用 AnimationController 实现平滑且视觉上吸引人的动画效果。
  • 无缝集成到 TextFormFieldInputDecoration 中。

入门指南 🔥

首先,在你的项目中添加 animated_input_border 作为依赖项。

dependencies:
  animated_input_border: <latest_version>

运行以下命令以获取依赖项:

$ flutter pub get

在 Dart 代码中导入它:

import 'package:animated_input_border/animated_input_border.dart';

接下来,你可以使用 AnimatedInputBorder 来创建具有动画效果的输入框边框。

TextFormField(
  focusNode: focusNode,
  decoration: InputDecoration(
    label: const Text("Focused Border Animation"),
    border: const OutlineInputBorder(),
    focusedBorder: AnimatedInputBorder(
      animationValue: _animationFocusedBorder.value, // 创建动画控制器
      borderRadius: BorderRadius.circular(20.0),
      borderSide: const BorderSide(
        width: 2,
        color: Colors.deepPurple,
      )),
    hintText: "Enter value"),
);

其他示例 🤯

你还可以尝试缩放动画。开发者可以自行尝试。以下是代码片段:

TextFormField(
  focusNode: focusNode,
  decoration: InputDecoration(
    border: const OutlineInputBorder(),
    focusedBorder: AnimatedInputBorder(
      borderRadius: BorderRadius.circular(20.0),
      borderSide: const BorderSide(
        width: 3,
        color: Colors.green,
      )).scale(_animationFocusedBorder.value),
    hintText: "Enter value"),
);

贡献

欢迎贡献、提出问题和功能请求!请查看 GitHub 仓库

作者

由 Pranim S. Thakuri 用心开发。

示例代码

以下是完整的示例代码,展示了如何使用 AnimatedInputBorder 插件。

import 'package:animated_input_border/animated_input_border.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: 'Flutter Animated TextField',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Column(
        mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          AnimatedInputBorderExample(),
          AnimatedInputFocusedBorderExample(),
        ],
      ),
    );
  }
}

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

  [@override](/user/override)
  State<AnimatedInputBorderExample> createState() => _AnimatedInputBorderExampleState();
}

class _AnimatedInputBorderExampleState extends State<AnimatedInputBorderExample> with SingleTickerProviderStateMixin {
  late AnimationController _animationController;

  [@override](/user/override)
  void initState() {
    super.initState();
    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 800),
    );

    // 启动动画以响应小部件渲染
    _animationController.forward();
  }

  [@override](/user/override)
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: AnimatedBuilder(
        animation: _animationController,
        builder: (context, child) {
          return TextFormField(
            decoration: InputDecoration(
              hintText: "Simple Border animation",
              border: AnimatedInputBorder(
                animationValue: _animationController.value,
              ),
            ),
          );
        },
      ),
    );
  }
}

// 这个示例使用 AnimationController 动画文本字段的聚焦边框。
// 边框在输入字段获得或失去焦点时动态更改其样式(例如,半径、宽度)。

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

  [@override](/user/override)
  State<AnimatedInputFocusedBorderExample> createState() => _AnimatedInputFocusedBorderExampleState();
}

class _AnimatedInputFocusedBorderExampleState extends State<AnimatedInputFocusedBorderExample> with SingleTickerProviderStateMixin {
  late AnimationController _animationFocusedBorder;
  late FocusNode focusNode;

  [@override](/user/override)
  void initState() {
    super.initState();

    // 为聚焦边框示例设置焦点节点
    focusNode = FocusNode();

    // 为聚焦边框示例创建动画控制器
    _animationFocusedBorder = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 2000),
    );

    // 监听器函数,当边框聚焦时执行动画
    _animateBorderOnFocusChange();
  }

  // 根据焦点状态的变化动画边框
  void _animateBorderOnFocusChange() {
    focusNode.addListener(() {
      if (focusNode.hasFocus) {
        _animationFocusedBorder.forward();
      } else {
        _animationFocusedBorder.value = 0.0;
      }
    });
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    _animationFocusedBorder.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: AnimatedBuilder(
        animation: _animationFocusedBorder,
        builder: (context, child) {
          return TextFormField(
            focusNode: focusNode,
            decoration: InputDecoration(
              border: const OutlineInputBorder(),
              focusedBorder: AnimatedInputBorder(
                borderRadius: BorderRadius.circular(20.0),
                borderSide: const BorderSide(
                  width: 3,
                  color: Colors.green,
                )).scale(_animationFocusedBorder.value),
              hintText: "Enter value",
            ),
          );
        },
      ),
    );
  }
}

更多关于Flutter动画输入框边框插件animated_input_border的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动画输入框边框插件animated_input_border的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


animated_input_border 是一个用于 Flutter 的插件,它允许你为输入框(如 TextFieldTextFormField)添加动画边框效果。这个插件可以帮助你创建更加动态和吸引人的用户界面。

安装

首先,你需要在 pubspec.yaml 文件中添加 animated_input_border 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  animated_input_border: ^1.0.0  # 请检查最新版本

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

基本使用

以下是一个简单的示例,展示了如何使用 animated_input_border 插件为 TextField 添加动画边框:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Animated Input Border Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: [
              AnimatedInputBorder(
                focusedBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.blue, width: 2.0),
                ),
                unfocusedBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.grey, width: 1.0),
                ),
                child: TextField(
                  decoration: InputDecoration(
                    labelText: 'Enter your text',
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

参数说明

  • focusedBorder: 当输入框获得焦点时显示的边框样式。通常是一个 OutlineInputBorder,你可以自定义颜色和宽度。
  • unfocusedBorder: 当输入框失去焦点时显示的边框样式。同样,你可以自定义颜色和宽度。
  • child: 你要应用动画边框的输入框组件,通常是 TextFieldTextFormField

自定义动画

你可以通过调整 focusedBorderunfocusedBorder 的样式来自定义动画效果。例如,你可以更改边框的颜色、宽度、圆角等。

示例:自定义圆角边框

AnimatedInputBorder(
  focusedBorder: OutlineInputBorder(
    borderSide: BorderSide(color: Colors.green, width: 2.0),
    borderRadius: BorderRadius.circular(20.0),
  ),
  unfocusedBorder: OutlineInputBorder(
    borderSide: BorderSide(color: Colors.grey, width: 1.0),
    borderRadius: BorderRadius.circular(10.0),
  ),
  child: TextField(
    decoration: InputDecoration(
      labelText: 'Enter your text',
    ),
  ),
)
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!