美文网首页
Flutter制作歌词遮罩渐变动画

Flutter制作歌词遮罩渐变动画

作者: 雨夜剪魂 | 来源:发表于2019-12-01 15:30 被阅读0次

遮罩歌词的原理

1.我们知道使用Flash可以很容易的制作一个遮罩的动画,以便于显示歌词的进度。原理是在第一层显示动画歌词,第二层显示的是原歌词,在顶层创建一个渐变的矩形,它从宽度为0到宽度增加到覆盖歌词的宽度并作为一个遮罩层,这样歌词便会被遮住,随着动画的进行,歌词会慢慢浮现。

2.使用flutter的ShaderMask可制作这样的动画

ShaderMask(
                        
                        child: Center(child: new Text(
                          '天青色等烟雨,而我在等你',
                        )
                          ),

                          
                        shaderCallback: (rect) {
                          print(rect.width);
                          return LinearGradient(
                            colors: [
                              Colors.greenAccent,
                              Colors.transparent,
                            ],
                            begin: Alignment.centerLeft,
                            end: Alignment.centerRight,
                            stops: [stopTween.value, 1],
                          ).createShader(rect);
                        },

child可以显示歌词,在shaderCallback中它接受一个shape的类型,也就是一个图形,rect一个矩形,在这个矩形中使用了线性渐变即 LinearGradient,stop这个属性,它随着动画值来移动渐变的停止点,以此形成渐变的动画了。
3.使用stack叠加一个原歌词text

Stack(
....
Opacity(
                        opacity: opacityTween.value,
                        child: Center(child: Text('天青色等烟雨,而我在等你', style: TextStyle(color: Colors.black38),)),
                      )

在下面使用了透明组件,将原歌词从不透明到透明动画缓缓显示出来,到原歌词透明度从1到0, 那么下面的渐变歌词就显示出来了。
4.具体的问题
我们的问题在于并不是使用宽度渐变来制作,这样歌词动画显示不是很自然的。我们可以多调整flutter 动画组件的曲线来测试出最好的值设置动画,使其更加的自然流畅。
5.代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

class ParentingAnimationWidget extends StatefulWidget {
  @override
  ParentingAnimationWidgetState createState() =>
      ParentingAnimationWidgetState();
}

class ParentingAnimationWidgetState extends State<ParentingAnimationWidget>
    with TickerProviderStateMixin {
  Animation opacityTween;
  Animation widthTween;
  Animation stopTween;
  AnimationController _controller;

  @override
  void dispose() {
    // TODO: implement dispose
    _controller.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
        duration: const Duration(milliseconds: 3100), vsync: this)
      ..addStatusListener((status) {
        if (status == AnimationStatus.completed) {
          setState(() {
            _controller.reset(); // 在动画状态是完成的时候,再进行重置
            _controller.forward(); // 在动画状态是完成的时候,再进行开始动画。
          });
        }
      });

    stopTween = Tween<double>(
      begin: 0,
      end: 1,
    ).animate(CurvedAnimation(
      parent: _controller,
      curve: Curves.fastOutSlowIn,
    ));

    widthTween = Tween<double>(
      begin: 0,
      end: 500,
    ).animate(CurvedAnimation(
      parent: _controller,
      curve: Curves.fastOutSlowIn
    ));
    
    opacityTween = Tween<double>(
      begin: 1,
      end: 0,
    ).animate(
      CurvedAnimation(
        parent: _controller,
        curve: Curves.easeIn
      )
    );
    _controller.forward();
  }


  @override
  @override
  Widget build(BuildContext context) {
    return AnimatedBuilder(
        animation: _controller,
        builder: (BuildContext context, Widget child) {
          return Scaffold(
              appBar: new AppBar(
                title: new Text('歌词遮罩显示'),
              ),
              body: MediaQuery.removePadding(
                  context: context,
                  removeTop: true,
                  child: Stack(
                    children: <Widget>[
                      ShaderMask(
                        
                        child: Center(child: new Text(
                          '天青色等烟雨,而我在等你',
                        )
                          ),

                          
                        shaderCallback: (rect) {
                          print(rect.width);
                          return LinearGradient(
                            colors: [
                              Colors.greenAccent,
                              Colors.transparent,
                            ],
                            begin: Alignment.centerLeft,
                            end: Alignment.centerRight,
                            stops: [stopTween.value, 1],
                          ).createShader(rect);
                        },
                        
                        blendMode: BlendMode.srcATop,
                      ),
                      Opacity(
                        opacity: opacityTween.value,
                        child: Center(child: Text('天青色等烟雨,而我在等你', style: TextStyle(color: Colors.black38),)),
                      )
                    ],
                  )));
        });
  }
}

相关文章

  • Flutter制作歌词遮罩渐变动画

    遮罩歌词的原理 1.我们知道使用Flash可以很容易的制作一个遮罩的动画,以便于显示歌词的进度。原理是在第一层显示...

  • SVG-滤镜与动画

    滤镜 剪切 渐变 线性渐变 径向渐变 遮罩 嵌入光栅图像 动画 SMIL Synchronized Multime...

  • Axure实现遮罩效果

    很多时候我们在编辑视频的时候经常需要用到遮罩的效果,一般制作遮罩动画,就是指一个遮罩层同时遮罩多个被遮罩层的遮罩动...

  • Flutter 基础动画 Hero动画 交错动画

    Flutter动画学习效果直接贴代码 运行看吧,更改push入口查看不同动画效果。基础动画:颜色渐变、控件大小更改...

  • V3定格动画制作

    重点:关键帧动画、遮罩定格动画的制作:可以拍摄连续的视频,然后剪辑的时候进行砍素材。(比较方便!) 1.导入素材 ...

  • 动画设计

    过渡动画 animation动画 多帧动画 文字遮罩

  • iOS渐变彩色文字、iOS mask 遮罩

    iOS渐变彩色文字、iOS mask 遮罩 使用到了YYCategories 彩色文字 过渡遮罩

  • 动画设计

    过渡动画 animation动画 多帧动画 文字遮罩 附录

  • CALayer

    CAGradientLayer 渐变色遮罩 CAGradientLayer用来绘制渐变色,指定几个颜色值、渐变结束...

  • 动画

    过渡动画 运动曲线 图片文字遮罩 transition动画 animation 动画 作业

网友评论

      本文标题:Flutter制作歌词遮罩渐变动画

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