如何在颤动中为容器设置边框动画

Jee*_*ane 6 dart flutter flutter-layout

我想用颤动的发光效果为我的容器设置边框动画,你有什么想法吗?

Lak*_*ngh 12

下面的代码将动画边框的宽度

class Test extends StatefulWidget {
  @override
  _TestState createState() => _TestState();
}

class _TestState extends State<Test> with TickerProviderStateMixin {

  AnimationController _resizableController;

  AnimatedBuilder getContainer() {
    return new AnimatedBuilder(
        animation: _resizableController,
        builder: (context, child) {
          return Container(
            padding: EdgeInsets.all(24),
            child: Text("SAMPLE"),
            decoration: BoxDecoration(
              shape: BoxShape.rectangle,
              borderRadius: BorderRadius.all(Radius.circular(12)),
              border: Border.all(
                  color: Colors.blue, width: _resizableController.value * 10),
            ),
          );
        });
  }

  @override
  void initState() {
    _resizableController = new AnimationController(
      vsync: this,
      duration: new Duration(
        milliseconds: 1000,
      ),
    );
    _resizableController.addStatusListener((animationStatus) {
      switch (animationStatus) {
        case AnimationStatus.completed:
          _resizableController.reverse();
          break;
        case AnimationStatus.dismissed:
          _resizableController.forward();
          break;
        case AnimationStatus.forward:
          break;
        case AnimationStatus.reverse:
          break;
      }
    });
    _resizableController.forward();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          title: Text("Test"),
          centerTitle: true,
        ),
        body: Center(child: getContainer()));
  }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Jee*_*ane 5

感谢 Lakhwinder Singh,我编写了这段代码,它实现了我要求的发光效果:

import 'package:flutter/material.dart';

void main()  {
  runApp(new Test());
}

class Test extends StatefulWidget {
  @override
  _TestState createState() => _TestState();
}

class _TestState extends State<Test> with TickerProviderStateMixin {

  AnimationController _resizableController;

  static Color colorVariation(int note){
    if(note <= 1){
      return Colors.blue[50];
    }else if(note>1 && note<=2){
      return Colors.blue[100];
    }else if(note>2 && note<=3){
      return Colors.blue[200];
    }else if(note>3 && note<=4){
      return Colors.blue[300];
    }else if(note>4 && note<=5){
      return Colors.blue[400];
    }else if(note>5 && note<=6){
      return Colors.blue;
    }else if(note>6 && note<=7){
      return Colors.blue[600];
    }else if(note>7 && note<=8){
      return Colors.blue[700];
    }else if(note>8 && note<=9){
      return Colors.blue[800];
    }else if(note>9 && note<=10){
      return Colors.blue[900];
    }
  }

  AnimatedBuilder getContainer() {
    return new AnimatedBuilder(
        animation: _resizableController,
        builder: (context, child) {
          return Container(
            //color: colorVariation((_resizableController.value *100).round()),
            padding: EdgeInsets.all(24),
            child: Text("SAMPLE"),
            decoration: BoxDecoration(
              shape: BoxShape.rectangle,
              borderRadius: BorderRadius.all(Radius.circular(12)),
              border: Border.all(
                  color: colorVariation((_resizableController.value *10).round()), width:10),
            ),
          );
        });
  }

  @override
  void initState() {
    _resizableController = new AnimationController(
      vsync: this,
      duration: new Duration(
        milliseconds: 500,
      ),
    );
    _resizableController.addStatusListener((animationStatus) {
      switch (animationStatus) {
        case AnimationStatus.completed:
          _resizableController.reverse();
          break;
        case AnimationStatus.dismissed:
          _resizableController.forward();
          break;
        case AnimationStatus.forward:
          break;
        case AnimationStatus.reverse:
          break;
      }
    });
    _resizableController.forward();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home:Scaffold(
        backgroundColor: Colors.white,
        body: Center(child: getContainer())));
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 那些 if else if else... 可以替换为 Colors.blue.withOpacity(note / 10) (4认同)
  • 或者只是简单的 Color colorVariation(double note) { return Colors.blue.withOpacity(note); } 并在容器中: color: colorVariation(_ressizedController.value), (2认同)
  • 您能否将代码的输出动画发布在 GIF 文件中,就像 Lakhwinder Singh 在他的答案中发布的那样。 (2认同)