<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    Flutter 音樂波形圖動畫效果

    共 5725字,需瀏覽 12分鐘

     ·

    2021-10-10 05:42

    音樂波形圖動畫效果是Loading動畫系列中的一個,github地址:https://github.com/LaoMengFlutter/flutter-do

    Loading動畫效果如下


    其中音樂波形圖動畫效果如下


    下面我們看看音樂波形圖動畫效果是如何實現(xiàn)的?動畫效果實現(xiàn)的思路是繪制一個靜止的效果,其中可變的效果使用參數(shù)控制,效果如下:

    一個柱形條代碼如下:

    class?Bar?extends?StatelessWidget?{
    ??final?double?width;
    ??final?double?height;
    ??final?Color?color;
    ??final?BorderRadiusGeometry?borderRadius;

    ??const?Bar({
    ????Key??key,
    ????required?this.width,
    ????required?this.height,
    ????this.color?=?Colors.white,
    ????required?this.borderRadius,
    ??})?:?super(key:?key);

    ??@override
    ??Widget?build(BuildContext?context)?{
    ????return?SizedBox(
    ????????width:?width,
    ????????height:?height,
    ????????child:?DecoratedBox(
    ??????????decoration:?BoxDecoration(
    ????????????shape:?BoxShape.rectangle,
    ????????????color:?color,
    ????????????borderRadius:?borderRadius,
    ??????????),
    ????????));
    ??}
    }

    4個柱形條代碼如下:

    Row(
    ????????????crossAxisAlignment:?CrossAxisAlignment.end,
    ????????????mainAxisAlignment:?MainAxisAlignment.spaceBetween,
    ????????????children:?[
    ??????????????Bar(
    ????????????????color:?widget.color,
    ????????????????width:?widget.width,
    ????????????????borderRadius:?widget.borderRadius,
    ????????????????height:?.5?*?widget.height,
    ??????????????),
    ??????????????Bar(
    ????????????????color:?widget.color,
    ????????????????width:?widget.width,
    ????????????????borderRadius:?widget.borderRadius,
    ????????????????height:?.5?*?widget.height,
    ??????????????),
    ??????????????Bar(
    ????????????????color:?widget.color,
    ????????????????width:?widget.width,
    ????????????????borderRadius:?widget.borderRadius,
    ????????????????height:?.5?*?widget.height,
    ??????????????),
    ??????????????Bar(
    ????????????????color:?widget.color,
    ????????????????width:?widget.width,
    ????????????????borderRadius:?widget.borderRadius,
    ????????????????height:?.5?*?widget.height,
    ??????????????),
    ????????????],
    ??????????)

    下面讓4個柱形條動起來,改變其高度,代碼如下:

    class?BarMusicLoading?extends?StatefulWidget?{
    ??final?double?width;
    ??final?double?height;
    ??final?Color?color;
    ??final?BorderRadiusGeometry?borderRadius;
    ??final?Duration?duration;
    ??final?Curve?curve;

    ??const?BarMusicLoading(
    ??????{Key??key,
    ????????this.width?=?3.0,
    ????????this.height?=?40.0,
    ????????this.color?=?Colors.blue,
    ????????this.borderRadius?=?const?BorderRadius.only(
    ????????????topLeft:?Radius.circular(3),?topRight:?Radius.circular(3)),
    ????????this.duration?=?const?Duration(milliseconds:?3000),
    ????????this.curve?=?Curves.easeInOut})
    ??????:?super(key:?key);

    ??@override
    ??_BarMusicLoadingState?createState()?=>?_BarMusicLoadingState();
    }

    class?_BarMusicLoadingState?extends?State<BarMusicLoading>
    ????with?SingleTickerProviderStateMixin?
    {
    ??late?AnimationController?_controller;

    ??late?Animation?_animation,?_animation1,?_animation2,?_animation3;
    ??List?values?=?[
    ????[0.0,?0.7,?0.4,?0.05,?0.95,?0.3,?0.9,?0.4,?0.15,?0.18,?0.75,?0.01],
    ????[0.05,?0.95,?0.3,?0.9,?0.4,?0.15,?0.18,?0.75,?0.01,?0.0,?0.7,?0.4],
    ????[0.9,?0.4,?0.15,?0.18,?0.75,?0.01,?0.0,?0.7,?0.4,?0.05,?0.95,?0.3],
    ????[0.18,?0.75,?0.01,?0.0,?0.7,?0.4,?0.05,?0.95,?0.3,?0.9,?0.4,?0.15],
    ??];

    ??@override
    ??void?initState()?{
    ????_controller?=?AnimationController(vsync:?this,?duration:?widget.duration)
    ??????..repeat();

    ????_animation?=?TweenSequence([
    ??????...List.generate(11,?(index)?{
    ????????return?TweenSequenceItem(
    ????????????tween:?Tween(begin:?values[0][index],?end:?values[0][index?+?1]),
    ????????????weight:?100.0?/?values.length);
    ??????}).toList()
    ????]).animate(CurvedAnimation(parent:?_controller,?curve:?widget.curve));

    ????_animation1?=?TweenSequence([
    ??????...List.generate(11,?(index)?{
    ????????return?TweenSequenceItem(
    ????????????tween:?Tween(begin:?values[1][index],?end:?values[1][index?+?1]),
    ????????????weight:?100.0?/?values.length);
    ??????}).toList()
    ????]).animate(CurvedAnimation(parent:?_controller,?curve:?widget.curve));

    ????_animation2?=?TweenSequence([
    ??????...List.generate(11,?(index)?{
    ????????return?TweenSequenceItem(
    ????????????tween:?Tween(begin:?values[2][index],?end:?values[2][index?+?1]),
    ????????????weight:?100.0?/?values.length);
    ??????}).toList()
    ????]).animate(CurvedAnimation(parent:?_controller,?curve:?widget.curve));

    ????_animation3?=?TweenSequence([
    ??????...List.generate(11,?(index)?{
    ????????return?TweenSequenceItem(
    ????????????tween:?Tween(begin:?values[3][index],?end:?values[3][index?+?1]),
    ????????????weight:?100.0?/?values.length);
    ??????}).toList()
    ????]).animate(CurvedAnimation(parent:?_controller,?curve:?widget.curve));

    ????super.initState();
    ??}

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

    ??@override
    ??Widget?build(BuildContext?context)?{
    ????return?AnimatedBuilder(
    ????????animation:?_controller,
    ????????builder:?(context,?child)?{
    ??????????return?Row(
    ????????????crossAxisAlignment:?CrossAxisAlignment.end,
    ????????????mainAxisAlignment:?MainAxisAlignment.spaceBetween,
    ????????????children:?[
    ??????????????Bar(
    ????????????????color:?widget.color,
    ????????????????width:?widget.width,
    ????????????????borderRadius:?widget.borderRadius,
    ????????????????height:?_animation.value?*?widget.height,
    ??????????????),
    ??????????????Bar(
    ????????????????color:?widget.color,
    ????????????????width:?widget.width,
    ????????????????borderRadius:?widget.borderRadius,
    ????????????????height:?_animation1.value?*?widget.height,
    ??????????????),
    ??????????????Bar(
    ????????????????color:?widget.color,
    ????????????????width:?widget.width,
    ????????????????borderRadius:?widget.borderRadius,
    ????????????????height:?_animation2.value?*?widget.height,
    ??????????????),
    ??????????????Bar(
    ????????????????color:?widget.color,
    ????????????????width:?widget.width,
    ????????????????borderRadius:?widget.borderRadius,
    ????????????????height:?_animation3.value?*?widget.height,
    ??????????????),
    ????????????],
    ??????????);
    ????????});
    ??}
    }

    最終的效果如下:


    瀏覽 144
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    柏欣彤Av色福利一二区 | 一本到久久 | 午夜精品久久久久久久 | 黄色AV网站免费 | 久久黄色片|