第三篇-用Flutter手擼一個抖音國內版,看看有多炫

来源:https://www.cnblogs.com/fengqingyangNo1/archive/2020/05/29/12985001.html
-Advertisement-
Play Games

前言 前一篇已經開發了大部分框架,包含視頻上下滑動播放,這次將上次未完成的數據顯示友好顯示,以及底部音樂走馬燈特效,另外優化了載入數據的bug,在dart語言里 & 會自動變成& 也不知道這個bug啥時候修複哈. 本系列會持續更新,將各個模塊及功能持續完善. 修複Dart語言 URL顯示錯誤 ...


前言

前一篇已經開發了大部分框架,包含視頻上下滑動播放,這次將上次未完成的數據顯示友好顯示,以及底部音樂走馬燈特效,另外優化了載入數據的bug,在dart語言里 & 會自動變成&  另外優化了代碼邏輯.

本系列會持續更新,將各個模塊及功能持續完善.

運行效果如下圖:

 

修複Dart語言 URL顯示錯誤.

經過反覆則是,發現url 在tostring()方法執行後 會把原來的 &替換成&amp,  所以暫時只能這樣替換了 url = url.replaceAll('&', '&')來修複問題了

  getVideos(BillboardData v) async {
    try {
      var url = v.link.split("/")[5];
      var response = await http.get(
        api.video + url + "&dytk",
        headers: api.headers,
      );
      VideoData videoData = VideoData.fromJson(jsonDecode(response.body));
      //獲取無水印的視頻地址
      api.getRedirects(videoData.itemList[0].video.playaddr.uri).then((url) => {
            url = url.replaceAll('&amp', '&'),
            if (url != '')
              {
                videos.add(VideoItem(
                  data: videoData,
                  videourl: url,
                )),
                //print(url),
              }
          });
    } catch (ex) {
      print(ex);
    }
  }

  

對數據友好格式化顯示

 先引用 import 'package:flutter_money_formatter/flutter_money_formatter.dart';其次按以下方法

    FlutterMoneyFormatter fmf =
        FlutterMoneyFormatter(amount: double.parse(widget.favorite.toString()));

    FlutterMoneyFormatter fmf2 =
        FlutterMoneyFormatter(amount: double.parse(widget.comments));

主要用來顯示的位置方法

 return Align(
        alignment: Alignment.bottomRight,
        widthFactor: 100.0,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            _getFollowAction(),
            _getSocialAction(
                icon: DouyinIcons.heart,
                title: '${fmf.output.compactNonSymbol}'),
            _getSocialAction(
                icon: DouyinIcons.chat_bubble,
                title: '${fmf2.output.compactNonSymbol}'),
            _getSocialAction(
                icon: DouyinIcons.reply, title: '分享', isShare: true),
            _getMusicPlayerAction()
          ],
        ));
  }

底部音樂名字走馬燈特效

先引入 import 'package:marquee_widget/marquee_widget.dart';  

反覆測試後發現,這裡需要設置width,否則沒有效果,切記.  

              Container(
                width: 150,
                child: Marquee(
                  child: Text('${widget.musicName} - ${widget.authorName}'),
                  direction: Axis.horizontal,
                  textDirection: TextDirection.ltr,
                  animationDuration: Duration(seconds: 1),
                  directionMarguee: DirectionMarguee.oneDirection,
                ),
              ),
            ])

 

 

音樂圖標旋轉效果

 

 先使用  SingleTickerProviderStateMixin,當元素顯示時才播放動畫效果

class _ActionsToolbarState extends State<ActionsToolbar>
    with SingleTickerProviderStateMixin {
  static const double ActionWidgetSize = 60.0;
  static const double ActionIconSize = 35.0;
  static const double ShareActionIconSize = 25.0;
  static const double ProfileImageSize = 50.0;
  static const double PlusIconSize = 20.0;
  AnimationController animationController;

 

然後設置初始化狀態,以及各種初始化參數。間隔 seconds: 5

  @override
  void initState() {
    super.initState();
    animationController = new AnimationController(
      vsync: this,
      duration: new Duration(seconds: 5),
    );
    animationController.repeat();
  }

 

這裡是完整的播放圖標改造後的代碼

Widget _getMusicPlayerAction() {
    return Container(
        margin: EdgeInsets.only(top: 10.0),
        width: ActionWidgetSize,
        height: ActionWidgetSize,
        child: Column(children: [
          Container(
            decoration: new BoxDecoration(
              borderRadius: BorderRadius.all(Radius.circular(25.0)),
              color: Colors.black54,
            ),
            padding: EdgeInsets.all(11.0),
            height: ProfileImageSize,
            width: ProfileImageSize,
            child: AnimatedBuilder(
              animation: animationController,
              child: Container(
                decoration: BoxDecoration(
                  shape: BoxShape.circle,
                  gradient: musicGradient,
                  //border: Border.all(color: Colors.black87, width: 11.0),
                  image: DecorationImage(
                    image: NetworkImage(widget.coverImg),
                    fit: BoxFit.cover,
                  ),
                ),
              ),
              builder: (BuildContext context, Widget _widget) {
                return Transform.rotate(
                  angle: animationController.value * 6.3,
                  child: _widget,
                );
              },
            ),

            // decoration: BoxDecoration(
            //   shape: BoxShape.circle,
            //   gradient: musicGradient,
            //   border: Border.all(color: Colors.black87, width: 11.0),
            //   image: DecorationImage(
            //     image: NetworkImage(widget.coverImg),
            //     fit: BoxFit.cover,
            //   ),
            // ),
          ),
        ]));
  }

 

結語

本博客會持續更新,將在業餘時間將其他的功能完善。請持續關註本博客,代碼地址:https://github.com/WangCharlie/douyin

歡迎各位點擊star 和fork 代碼. 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 參見阮一峰的這篇,比較清晰,比其他二手的說得更清楚 http://www.ruanyifeng.com/blog/2013/10/event_loop.html ...
  • # 2.響應式原理 - 響應式具有的特點 1.網頁寬度自動調整 2.儘量少用絕對寬度 3.字體要使用rem、em作為單位 4.佈局要使用浮動或者彈性佈局 響應式下任何東西都要隨著屏幕的尺寸改變而改變不能使用絕對大小 - 媒體查詢 根據一個或多個基於設備類型、具體特點和環境來應用樣式 @media @ ...
  • ...
  • URI 規範和 W3C 規範衝突了,才會搞出這種讓人疑惑的烏龍事件 ...
  • 如何通過 X-Forwarded-For 拿到用戶真實 IP ...
  • 備忘錄模式提供了一種對象狀態的撤銷實現機制,當系統中某一對象需要恢復到某一歷史狀態時可以使用備忘錄模式來進行設計 模式動機 人人都有後悔的時候,在軟體使用過程中難免會出現一些誤操作,如不小心刪除了某些文字或圖片,數據填入錯誤等,對於這些誤操作,需要提供一種後悔藥機制,讓系統可以回到誤操作前的狀態,這 ...
  • 一、前言 之前項目裡面都是基於Springboot +vue 開發,接下里公司準備做一個物聯網平臺和企業信息化系統,還是幾年前使用過springcloud的我決定系統的總結springcloud中各個組件,供自己學習以及各位博友討論。在此過程中涉及到的架構代碼都將在碼雲或者 github 共用出來, ...
  • C 數組允許定義可存儲相同類型數據項的變數,結構是 C 編程中另一種用戶自定義的可用的數據類型,它允許您存儲不同類型的數據項。 結構用於表示一條記錄,假設您想要跟蹤圖書館中書本的動態,您可能需要跟蹤每本書的下列屬性: Title Author Subject Book ID 定義結構 為了定義結構, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...