Flutter實(shí)現(xiàn)馬蜂窩小紅書自適應(yīng)高度輪播圖

最終效果

項(xiàng)目地址

演示代碼地址

image

實(shí)現(xiàn)方法

使用PageView組件

NotificationListener可以監(jiān)聽PageView的改變革骨,比如滑動(dòng)的距離拧篮,頁面索引等蠢壹,目前只使用的了索引区匠。里面的一些方法挺有用的负蠕。

              NotificationListener(
                onNotification: (ScrollNotification scrollInfo) {
                  // print(scrollInfo.metrics.pixels);
                  // print(scrollInfo.metrics.viewportDimension);
                  // print(_controller.page);
                  this.setState(() {
                    this.activeIndex = _controller.page.round();
                  });
                  return true;
                },
                child: PageView(
                    controller: _controller,
                    children: pictrueList
                        .map((PictrueData data) => FadeInImage.assetNetwork(
                              placeholder: "lib/assets/loading_img.gif",
                              image: data.url,
                              fit: BoxFit.cover,
                              alignment: Alignment.center,
                            ))
                        .toList()),
              ),

AnimatedContainer

使用AnimatedContainer組件保證切換以后會(huì)有流程的過渡效果,表現(xiàn)的會(huì)平滑一些蛙埂。

完整代碼

        AnimatedContainer(
          duration: Duration(milliseconds: 300),
          height: pictrueData.height * deviceWidth / pictrueData.width,
          curve: Curves.ease,
          child: Stack(
            children: <Widget>[
              NotificationListener(
                onNotification: (ScrollNotification scrollInfo) {
                  // print(scrollInfo.metrics.pixels);
                  // print(scrollInfo.metrics.viewportDimension);
                  // print(_controller.page);
                  this.setState(() {
                    this.activeIndex = _controller.page.round();
                  });
                  return true;
                },
                child: PageView(
                    controller: _controller,
                    children: pictrueList
                        .map((PictrueData data) => FadeInImage.assetNetwork(
                              placeholder: "lib/assets/loading_img.gif",
                              image: data.url,
                              fit: BoxFit.cover,
                              alignment: Alignment.center,
                            ))
                        .toList()),
              ),
              Positioned(
                bottom: 10.0,
                right: 10.0,
                child: Container(
                  padding: EdgeInsets.symmetric(horizontal: 5.0, vertical: 3.0),
                  decoration: BoxDecoration(
                      color: Color.fromRGBO(0, 0, 0, 0.5),
                      borderRadius: BorderRadius.circular(20.0)),
                  child: Text(
                    '${activeIndex + 1}/${pictrueList.length}',
                    style: TextStyle(
                        color: const Color(0xffffffff), fontSize: 10.0),
                  ),
                ),
              )
            ],
          ),
        )

重點(diǎn)

首先,返回?cái)?shù)據(jù)需要包含圖片的寬高信息遮糖,就像這樣:

  List<PictrueData> pictrueList = [
    PictrueData(
        width: 1920.0,
        height: 1152.0,
        url:
            "http://admin.soscoon.com/uploadImages/24294a8960f7cec4a5bb77276b8d1804eddc0023.jpg"),
    PictrueData(
        width: 550.0,
        height: 810.00,
        url:
            "http://admin.soscoon.com/uploadImages/72041ef01b9c8dd543511968d8659817c0086145.jpeg"),
    PictrueData(
        width: 1600.0,
        height: 900.00,
        url:
            "http://admin.soscoon.com/uploadImages/c236aa0af948e5d8812d23bd9eb1878682f247d8.jpg"),
    PictrueData(
        width: 1900.0,
        height: 1200.00,
        url:
            "http://admin.soscoon.com/uploadImages/41b2b4490204912f345b80be4fa88d7f5c9487a7.jpg"),
    PictrueData(
        width: 1920.0,
        height: 1000.00,
        url:
            "http://admin.soscoon.com/uploadImages/52a138c4dfcfbaab74daec69f128a2dd6dbf558f.jpg"),
  ];

如果返回的只有圖片信息沒有寬高數(shù)據(jù)可以使用以下方法去獲得圖片的信息,這樣也可以得到圖片的寬高信息绣的,不太建議,還是直接叫后端給欲账,我們也方便處理屡江,要是后端說他們給不了就拿上磚頭去叫他們加,就想偷懶赛不。

class MyHomePage extends StatelessWidget {
  Widget build(BuildContext context) {
    Image image = new Image.network(
        'https://timgsa.baidu.com/timg?image&quality=80&size=b10000_10000&sec=1564812422&di=a113f4b98d25442643ad9236f01ecbf5&src=http://hbimg.b0.upaiyun.com/0338cbe93580d5e6b0e89f25531541d455f66fda4a6a5-eVWQaf_fw658');
    Completer<ui.Image> completer = new Completer<ui.Image>();
    image.image.resolve(new ImageConfiguration()).addListener(
        ImageStreamListener(
            (ImageInfo info, bool _) => completer.complete(info.image)));
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Image Dimensions Example"),
      ),
      body: new ListView(
        children: [
          new FutureBuilder<ui.Image>(
            future: completer.future,
            builder: (BuildContext context, AsyncSnapshot<ui.Image> snapshot) {
              if (snapshot.hasData) {
                return new Text(
                  '${snapshot.data.width}x${snapshot.data.height}',
                  style: Theme.of(context).textTheme.display3,
                );
              } else {
                return new Text('Loading...');
              }
            },
          ),
          image,
        ],
      ),
    );
  }
}

自適應(yīng)輪播圖的高度我們需要原始圖片的寬高比惩嘉,或者知道原始圖的寬高。顯示的時(shí)候按照原始的寬高比進(jìn)行等比例縮放踢故。

_controller.page獲取到的是一個(gè)浮點(diǎn)數(shù)文黎,類似1.0325441,使用round四舍五入出現(xiàn)的效果就是我們拖到一半或以上就可以得到下一個(gè)activeIndex惹苗,activeIndex是一個(gè)整數(shù)。

_controller.page

flutter: 0.01314531968164951
flutter: 0.026430343836238882
flutter: 0.03609217958503115
flutter: 0.048169474271021494
flutter: 0.0517926626768186
flutter: 0.0590390394884128
flutter: 0.06386995736280894
flutter: 0.9918596275657323
flutter: 0.9928677347556618
flutter: 0.9948281247819616
flutter: 0.9955746971008173
flutter: 0.9966901944924708
flutter: 0.9971838269533462
flutter: 0.9978950491069947
flutter: 0.9981962948156735
flutter: 0.998685063281176
flutter: 1.0
// 當(dāng)前展示的banner圖數(shù)據(jù)
PictrueData pictrueData = pictrueList[activeIndex];
// 等比縮放算出現(xiàn)在的高度
height: pictrueData.height * deviceWidth / pictrueData.width,

我們動(dòng)態(tài)獲取了圖片的寬度以后放入AnimatedContainer就可以有過渡效果耸峭,真機(jī)和模擬器測試都很流暢桩蓉,可以已60幀渲染。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劳闹,一起剝皮案震驚了整個(gè)濱河市院究,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌本涕,老刑警劉巖业汰,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偏友,居然都是意外死亡蔬胯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門位他,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氛濒,“玉大人,你說我怎么就攤上這事鹅髓∥韪停” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窿冯,是天一觀的道長骗奖。 經(jīng)常有香客問我,道長醒串,這世上最難降的妖魔是什么执桌? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮芜赌,結(jié)果婚禮上仰挣,老公的妹妹穿的比我還像新娘。我一直安慰自己缠沈,他們只是感情好膘壶,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洲愤,像睡著了一般颓芭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柬赐,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天亡问,我揣著相機(jī)與錄音,去河邊找鬼肛宋。 笑死玛界,一個(gè)胖子當(dāng)著我的面吹牛万矾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慎框,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼后添!你這毒婦竟也來了笨枯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤遇西,失蹤者是張志新(化名)和其女友劉穎馅精,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粱檀,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洲敢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茄蚯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片压彭。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渗常,靈堂內(nèi)的尸體忽然破棺而出壮不,到底是詐尸還是另有隱情,我是刑警寧澤皱碘,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布询一,位于F島的核電站,受9級(jí)特大地震影響癌椿,放射性物質(zhì)發(fā)生泄漏健蕊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一踢俄、第九天 我趴在偏房一處隱蔽的房頂上張望缩功。 院中可真熱鬧,春花似錦褪贵、人聲如沸掂之。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽世舰。三九已至,卻和暖如春槽卫,著一層夾襖步出監(jiān)牢的瞬間跟压,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國打工歼培, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留震蒋,地道東北人茸塞。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像查剖,于是被迫代替她去往敵國和親钾虐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,111評(píng)論 1 32
  • 渾渾噩噩的8天馬上就要結(jié)束了笋庄,感覺就熬熬夜睡睡懶覺見見閨蜜效扫,日子就這樣悄悄溜走了,明天一早要開始新的旅程直砂。年輕人...
    蘿蘭閱讀 227評(píng)論 0 0
  • 下午跑去看書菌仁,挑了本余華的《活著》。 好沒出息静暂,淚點(diǎn)太低济丘,好幾次眼淚盈眶,差點(diǎn)要大哭出來洽蛀。 生命里難得的溫情將被一...
    浮生夢一場閱讀 412評(píng)論 4 5
  • 書名:終身成長 作者: [美] 卡羅爾·德韋克 副標(biāo)題:重新定義成功的思維模式 原作名:MINDSET: THE ...
    無00閱讀 527評(píng)論 0 6