【问题标题】:How to draw the Shape of Text?如何绘制文本的形状?
【发布时间】:2020-02-02 20:06:35
【问题描述】:

我正在尝试为颤动的标题文本制作动画前景,或者更准确地说,我希望将文本与 GIF 类似 我什至不知道该怎么做,但我想如果我设法制作堆栈填充 GIF 然后将最后一层设为CustomClipper<Path> 以填充整个空间,但文本形状会看起来像它,问题是我不知道如何制作文本形状!加上我不知道如何制作一条只填充整个大小的路径,除了我将提供的文本形状,请任何帮助将不胜感激,或者如果您有任何想法可以做到这一点,但以不同的方式我也很感兴趣并提前致谢。

【问题讨论】:

    标签: flutter dart flutter-animation


    【解决方案1】:

    啊,我来晚了……好吧,算了

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            appBar: AppBar(title: const Text('Title')),
            body: Stack(
              children: [
                FakeAnimatedBackground(),
                ShaderMask(
                  blendMode: BlendMode.srcOut,
                  shaderCallback: (bounds) => LinearGradient(colors: [Colors.black], stops: [0.0]).createShader(bounds),
                  child: SizedBox.expand(
                    child: Container(
                      color: Colors.transparent,
                      alignment: Alignment.center,
                      child: const Text('SOME TEXT', style: TextStyle(fontSize: 60, fontWeight: FontWeight.bold)),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    class FakeAnimatedBackground extends StatefulWidget {
      @override
      _FakeAnimatedBackgroundState createState() => _FakeAnimatedBackgroundState();
    }
    
    class _FakeAnimatedBackgroundState extends State<FakeAnimatedBackground> with TickerProviderStateMixin {
      AnimationController _controller;
    
      @override
      void initState() {
        super.initState();
        _controller = AnimationController(duration: const Duration(milliseconds: 5000), vsync: this)..repeat();
      }
    
      @override
      Widget build(BuildContext context) {
        return RotationTransition(
          alignment: Alignment.center,
          turns: Tween(begin: 0.0, end: 1.0).animate(_controller),
          child: Container(
            decoration: BoxDecoration(
              gradient: SweepGradient(colors: [Colors.red, Colors.green, Colors.blue, Colors.red]),
            ),
          ),
        );
      }
    }
    

    FakeAnimationBackground 类无所谓,只是模拟背景移动

    【讨论】:

    • 谢谢你,简洁明了,我接受了你,因为你的回答比 sahandevs 简单,而我对你们俩都投了赞成票,而且他的回答一开始就有一点点。
    【解决方案2】:

    您可以使用ImageShader、ShaderMask 和StreamBuilder(用于 gif)

    
    import 'dart:async';
    import 'package:flutter/material.dart';
    import 'dart:ui' as ui;
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(
            title: "test",
          ),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
    
      Stream<ui.Image> _image;
    
      @override
      initState() {
        super.initState();
        _image = _getImage();
      }
    
      Stream<ui.Image> _getImage() {
        var _controller = new StreamController<ui.Image>();
        new AssetImage('assets/b.gif')
            .resolve(new ImageConfiguration())
            .addListener(ImageStreamListener(
                (info, _) {
                  _controller.add(info.image);
                }
        ));
        return _controller.stream;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            body: Center(
              child: StreamBuilder<ui.Image>(
                stream: _image,
                builder: (context, data) {
                  if (data.data == null)
                    return Text('loading');
                  return ShaderMask(
                    child: Text("Gif !!", style: TextStyle(fontSize: 50),),
                    blendMode: BlendMode.srcATop,
                    shaderCallback: (bounds) {
                      return ui.ImageShader(
                        data.data,
                        TileMode.repeated,
                        TileMode.repeated,
                        Matrix4.identity().storage,
                      );
                    },
                  );
                },
              ),
            ));
      }
    
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 1970-01-01
      • 2019-05-05
      • 2012-07-09
      • 1970-01-01
      • 2020-09-21
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多