Flutter 仿抖音效果 (二) 界面布局

QQ20191231-184930.gif

Flutter 仿抖音效果 (一) 全屏點(diǎn)愛星
Flutter 仿抖音效果 (二) 界面布局
[Flutter 仿抖音效果 (三) 視頻播放列表] (http://www.reibang.com/p/d0f44241d80f)

項(xiàng)目地址:https://github.com/CZXBigBrother/flutter_TikTok 持續(xù)效果更新

實(shí)現(xiàn)界面布局效果需要解決的問題

  • 1.整體布局實(shí)現(xiàn)
  • 2.底部歌曲左右移動(dòng)效果


    Snip20191231_10.png

布局的實(shí)現(xiàn)

1.基本的布局是簡(jiǎn)單的,外層通過Stack作為根
2.左邊點(diǎn)贊的控件組通過Align進(jìn)行統(tǒng)一布局
3.頂部控件組通過Positioned進(jìn)行布局,設(shè)置頂部距離,其實(shí)也可以用align,我們多使用幾種來習(xí)慣flutter的布局
4.底部同樣使用Positioned,設(shè)置底部距離
5.子頁(yè)面的左右滑動(dòng)使用PageView,一開始我們要從推薦開始左滑到關(guān)注,可以使用reverse屬性,不需要更多額外的操作

細(xì)節(jié)實(shí)現(xiàn)

1.pageController監(jiān)聽

PageController pageController = new PageController(keepPage: false);
pageController.addListener(() {
      // print(pageController.page);
      if (pageController.page == 1) {
        this.stream.sink.add(1);
      } else if (pageController.page == 0) {
        this.stream.sink.add(0);
      }
    });

刷新頂部的下劃線時(shí),我們一樣使用StreamController刷新,這樣效率比setstate高很多

  StreamController<int> stream = new StreamController.broadcast();
  StreamBuilder<int>(
                  initialData: 0,
                  builder: (context, snapshot) {
                    return Text(
                      "推薦",
                      style: TextStyle(
                        color: Colors.white,
                        decoration: snapshot.data == 0
                            ? TextDecoration.underline
                            : TextDecoration.none,
                      ),
                    );
                  },
                  stream: this.stream.stream,
                )

2.歌曲名走馬燈效果

111.gif

這個(gè)效果看起來挺麻煩的其實(shí)實(shí)現(xiàn)起來超級(jí)的簡(jiǎn)單用最普通的ListView就能快速的實(shí)現(xiàn)
首頁(yè)listview里面套入的是最簡(jiǎn)單的container+text

Container(
      // color: Colors.red,
      // alignment: Alignment.centerLeft,
      child: Text(
        "三根皮帶歌曲,嘩啦啦啦啦啦啦啦啦啦啦啦",
        maxLines: 1,
        style: TextStyle(
          color: Colors.white,
        ),
        textAlign: TextAlign.left,
      ),
    )

listview添加一個(gè)ScrollController做為滑動(dòng)的控制

  ScrollController scroController = new ScrollController();

使用一個(gè)定時(shí)器,把listview滑到最大的位置之后,在滑回去
先通過scroController.position.maxScrollExtent獲取最大位置,
然后通過scroController.animateTo進(jìn)行滑動(dòng),因?yàn)槲以O(shè)置一次循環(huán)的時(shí)間是3000毫秒,所以滑過去和滑回來的時(shí)間各占一般 new Duration(milliseconds: (time * 0.5).toInt()),還有就是歌名沒有大于最大寬度時(shí)候其實(shí)我們不需要進(jìn)行滑動(dòng),所以判斷maxScrollExtent是否大于0來確定是否進(jìn)行滑動(dòng)動(dòng)畫

Timer timer;
  void startTimer() {
    int time = 3000;
    timer = Timer.periodic(new Duration(milliseconds: time), (timer) {
      if (scroController.positions.isNotEmpty == false) {
        print('界面被銷毀');
        return;
      }
      double maxScrollExtent = scroController.position.maxScrollExtent;
      // print(maxScrollExtent);
      // double pixels = scroController.position.pixels;
      if (maxScrollExtent > 0) {
        scroController.animateTo(maxScrollExtent,
            duration: new Duration(milliseconds: (time * 0.5).toInt()),
            curve: Curves.linear);
        Future.delayed(Duration(milliseconds: (time * 0.5).toInt()), () {
          if (scroController.positions.isNotEmpty == true) {
            scroController.animateTo(0,
                duration: new Duration(milliseconds: (time * 0.5).toInt()),
                curve: Curves.linear);
          }
        });
      } else {
        print('不需要移動(dòng)');
        timer.cancel();
      }
    });
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末份名,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捂齐,更是在濱河造成了極大的恐慌焙贷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歹叮,死亡現(xiàn)場(chǎng)離奇詭異跑杭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咆耿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門德谅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萨螺,你說我怎么就攤上這事窄做。” “怎么了慰技?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵椭盏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我惹盼,道長(zhǎng)庸汗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任手报,我火速辦了婚禮蚯舱,結(jié)果婚禮上改化,老公的妹妹穿的比我還像新娘。我一直安慰自己枉昏,他們只是感情好陈肛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兄裂,像睡著了一般句旱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晰奖,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天谈撒,我揣著相機(jī)與錄音,去河邊找鬼匾南。 笑死啃匿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛆楞。 我是一名探鬼主播溯乒,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼豹爹!你這毒婦竟也來了裆悄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤臂聋,失蹤者是張志新(化名)和其女友劉穎光稼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孩等,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钟哥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞎访。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吁恍,死狀恐怖扒秸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冀瓦,我是刑警寧澤伴奥,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站翼闽,受9級(jí)特大地震影響拾徙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜感局,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一尼啡、第九天 我趴在偏房一處隱蔽的房頂上張望暂衡。 院中可真熱鬧,春花似錦崖瞭、人聲如沸狂巢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唧领。三九已至,卻和暖如春雌续,著一層夾襖步出監(jiān)牢的瞬間斩个,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工驯杜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留受啥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓艇肴,卻偏偏與公主長(zhǎng)得像腔呜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子再悼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354