Flutter CustomScrollView 自定義滑動(dòng)效果

新建項(xiàng)目-8.png

CustomScrollView

構(gòu)造函數(shù)

 const CustomScrollView({
    Key key,
    Axis scrollDirection = Axis.vertical, //滑動(dòng)的方向
    bool reverse = false, //控制 CustomScrollView 里列表項(xiàng)的排列順序
    ScrollController controller, //可以控制 CustomScrollView 滾動(dòng)的位置
                                                                     ScrollController 提供以下的幾個(gè)功能:
                                                                     1.設(shè)置 CustomScrollView 滑動(dòng)的初始位置
                                                                     2.可以控制 CustomScrollView 是否存儲(chǔ)和恢復(fù)滑動(dòng)的位置
                                                                     3.可以讀取邻吞、設(shè)置當(dāng)前滑動(dòng)的位置
                                                                     可以繼承 ScrollController 實(shí)現(xiàn)自定義的功能
                                                                     當(dāng) primary 為 true 時(shí)恩够,controller 必須為 null
    bool primary,
    ScrollPhysics physics,
    bool shrinkWrap = false,
    Key center, //放在 CustomScrollView 中間的 子Widget 的 key 
    double anchor = 0.0, //CustomScrollView 開始滑動(dòng)的偏移量
                                                如果 anchor 為 0.0愿卸,則 CustomScrollView 的 子Widget 從頭開始排列
                                                如果 anchor 為 0.5棉胀,則 CustomScrollView 的 子Widget 從中間開始排列
                                                如果 anchor 為 1.0漆弄,則 CustomScrollView 的 子Widget 從底部開始排列    
    double cacheExtent,
    this.slivers = const <Widget>[],
    int semanticChildCount,
    DragStartBehavior dragStartBehavior = DragStartBehavior.start,//
                        確定處理拖動(dòng)開始行為的方式。
                                                如果設(shè)置為[DragStartBehavior.start]杠纵,則在檢測到拖動(dòng)手勢時(shí)將開始滾動(dòng)拖動(dòng)行為
                                                如果設(shè)置為[DragStartBehavior.down]袄简,它將在首次檢測到向下事件時(shí)開始   可選
  }) 

SliverAppBar

基本和AppBar一樣,只是他只能在CustomScrollView中使用,應(yīng)該很常見,滑動(dòng)的時(shí)候固定appbar,就需要用到他.

const SliverAppBar({
    Key key,
    this.leading,                          //左上角添加組件
    this.automaticallyImplyLeading = true,
    this.title,   
    this.actions,               //右上角添加組件
    this.flexibleSpace,   //擴(kuò)展的組件
    this.bottom,          //
    this.elevation,
    this.forceElevated = false,
    this.backgroundColor,
    this.brightness,
    this.iconTheme,
    this.actionsIconTheme,
    this.textTheme,
    this.primary = true,
    this.centerTitle,
    this.titleSpacing = NavigationToolbar.kMiddleSpacing,
    this.expandedHeight,
    this.floating = false,
    this.pinned = false,
    this.snap = false,
    this.stretch = false,
    this.stretchTriggerOffset = 100.0,
    this.onStretchTrigger,
    this.shape,
  })

大部分和appbar一樣,主要說下重要的幾個(gè):

pinned

是否將導(dǎo)航欄部分固定在appbar的位置.這個(gè)需求在實(shí)際中很常用. 看看效果圖.

當(dāng) pinned = false:

2020-04-13 17.41.58.gif

可以看到appbar并沒有固定在最上面,而是根據(jù)內(nèi)容劃出了界面.

當(dāng) pinned = true :

2020-04-13 17.43.50.gif

這個(gè)應(yīng)該是需求中經(jīng)常用到的效果了.

floating

當(dāng)floating = false :

2020-04-13 17.48.02.gif

當(dāng)floating = true:

2020-04-13 17.51.30.gif

仔細(xì)看 ,區(qū)別是在列表整體向下滑動(dòng)時(shí),appbar開始顯示的位置不同.

當(dāng)為false時(shí),向下滑動(dòng)時(shí),會(huì)先降列表內(nèi)容滑動(dòng)頂部,然后appbar會(huì)跟著列表滑動(dòng)顯示出來.如上圖

當(dāng)為true時(shí),向下滑動(dòng)時(shí),appbar會(huì)先跟著列表滑動(dòng)顯示出來. 然后繼續(xù)列表的滑動(dòng). 如上圖

snap

不能單獨(dú)使用要配合 ****floating 和 ****pinned

具體效果看官網(wǎng)地址

stretch

是否展開,默認(rèn)false,直接看值為true的效果圖,就明白了.

2020-04-13 18.05.55.gif

flexibleSpace

可以再里面添加擴(kuò)展的內(nèi)容:

 flexibleSpace: FlexibleSpaceBar(
   title: Text('開學(xué)季 Pinned 效果'),
   background: Image.network(
     "https://goss.cfp.cn/creative/vcg/800/new/VCG211165042753.jpg",
     fit: BoxFit.cover,
   ),
 ),
flexibleSpace: Row(
  children: <Widget>[
    Expanded(
      child: Image.network('https://goss.cfp.cn/creative/vcg/800/new/VCG211165042753.jpg',fit: BoxFit.cover,),
    )
  ],
),

通過測試發(fā)現(xiàn) **后面不是 FlexibleSpaceBar 的話, stretch = true 無效. **

SliverPadding

和Padding一樣.子控件是 sliver 類型...

const SliverPadding({
    Key key,
    @required this.padding,
    Widget sliver,
}) 

列子:

 SliverPadding(
   padding: EdgeInsets.only(top: 10),
   sliver: SliverToBoxAdapter(
     child: Container(
       height: 66,
       color: Colors.cyanAccent,
     ),
   ),
 ),

2020-04-13 18.28.54.gif

上圖中在padding中添加了一個(gè)背景色為青色的容器widget

SliverToBoxAdapter

const SliverToBoxAdapter({
    Key key,
    Widget child,
  })

里面可以設(shè)置不是sliver類型的widget蜀铲。如上圖中的 padding中添加的 container

SliverGrid

 const SliverGrid({
    Key key,
    @required SliverChildDelegate delegate,
    @required this.gridDelegate,
  })

就兩個(gè)協(xié)議,一個(gè)是布局協(xié)議一個(gè)展示協(xié)議.基本和GridView一樣.也有count和extext... 不設(shè)置個(gè)數(shù)默認(rèn)無數(shù)個(gè)

SliverChildListDelegate 這種方式前提是知道cell個(gè)數(shù)边琉,比較少,好搭建

SliverChildBuilderDelegate 這種方式记劝,可以根據(jù)數(shù)組去創(chuàng)建变姨,不知道cell個(gè)數(shù)

SliverFixedExtentList

 const SliverFixedExtentList({
    Key key,
    @required SliverChildDelegate delegate,
    @required this.itemExtent,
  }) : 

和listview差不多.也是協(xié)議 不設(shè)置個(gè)數(shù)默認(rèn)無數(shù)個(gè)

例子:

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

class MinePage extends StatefulWidget {
  @override
  _MinePageState createState() => _MinePageState();
}

class _MinePageState extends State<MinePage> {
  @override
  Widget build(BuildContext context) {
    return CustomScrollView(
         slivers: <Widget>[
           SliverAppBar(
             pinned: true,
             stretch: true,
             expandedHeight: 200.0,
             flexibleSpace: FlexibleSpaceBar(
               title: Text('開學(xué)季'),
               background: Image.network(
                 "https://goss.cfp.cn/creative/vcg/800/new/VCG211165042753.jpg",
                 fit: BoxFit.cover,
               ),
             ),
           ),
           SliverPadding(padding: EdgeInsets.only(top: 10),),
           SliverGrid(
             //調(diào)整間距
             gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
               crossAxisSpacing: 10,
               maxCrossAxisExtent: 200,
               mainAxisSpacing: 10,
               childAspectRatio: 4.0
             ),
             //加載內(nèi)容
             delegate: SliverChildBuilderDelegate(
                 (context,index) {
                   return Container( //設(shè)置每個(gè)item的內(nèi)容
                     alignment: Alignment.center,
                     color: Colors.orangeAccent,
                     child: Text("$index"),
                   );
                 },
               childCount: 20, //設(shè)置個(gè)數(shù)
             ),
           ),
           SliverPadding(padding: EdgeInsets.only(top: 10),),
           SliverFixedExtentList(
             itemExtent: 50,
             //加載內(nèi)容
             delegate: SliverChildBuilderDelegate(
                 (context, index) {
                   return Container(
                     alignment: Alignment.center,
                     color: Colors.deepPurpleAccent,
                     child: Text('$index'),
                   );
                 },
               //設(shè)置顯示個(gè)數(shù)
               childCount: 20,
             ),
           )
         ],
    );
  }
}
2020-04-13 18.14.54.gif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市厌丑,隨后出現(xiàn)的幾起案子定欧,更是在濱河造成了極大的恐慌,老刑警劉巖怒竿,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砍鸠,死亡現(xiàn)場離奇詭異,居然都是意外死亡耕驰,警方通過查閱死者的電腦和手機(jī)爷辱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朦肘,“玉大人饭弓,你說我怎么就攤上這事∶娇伲” “怎么了弟断?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長趴生。 經(jīng)常有香客問我阀趴,道長昏翰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任舍咖,我火速辦了婚禮矩父,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘排霉。我一直安慰自己,他們只是感情好民轴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布攻柠。 她就那樣靜靜地躺著,像睡著了一般后裸。 火紅的嫁衣襯著肌膚如雪瑰钮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天微驶,我揣著相機(jī)與錄音浪谴,去河邊找鬼。 笑死因苹,一個(gè)胖子當(dāng)著我的面吹牛苟耻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扶檐,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼凶杖,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了款筑?” 一聲冷哼從身側(cè)響起智蝠,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奈梳,沒想到半個(gè)月后杈湾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攘须,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年漆撞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阻课。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叫挟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出限煞,到底是詐尸還是另有隱情抹恳,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布署驻,位于F島的核電站奋献,受9級(jí)特大地震影響健霹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓶蚂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一糖埋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窃这,春花似錦瞳别、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兆解,卻和暖如春馆铁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锅睛。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工埠巨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人现拒。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓辣垒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親具练。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乍构,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353