在 Flutter 中創(chuàng)建圖像輪播

從社交媒體應(yīng)用程序到電子商務(wù)應(yīng)用程序,大多數(shù)現(xiàn)代應(yīng)用程序都有某種圖像輪播來(lái)展示產(chǎn)品、圖像或廣告。 由于 flutter 提供的內(nèi)置小部件,從頭開(kāi)始實(shí)現(xiàn)圖像輪播并不像您想象的那么難。 在本文中,您將學(xué)習(xí)如何從頭開(kāi)始創(chuàng)建圖像輪播并根據(jù)需要進(jìn)行自定義。最后,您將學(xué)習(xí)如何使用carousel_slider插件以更少的代碼創(chuàng)建圖像輪播。 這些是我們將要討論的主題。

  • 圖像輪播的小部件結(jié)構(gòu)
  • 使用 PageView 小部件創(chuàng)建輪播
  • 控制初始頁(yè)面
  • 添加位置指示器
  • 為滑動(dòng)圖像添加動(dòng)畫(huà)
  • 如何使用 carousel_slider 插件

圖像輪播的小部件結(jié)構(gòu)

在我們進(jìn)入編碼部分之前,讓我們了解我們需要擁有的小部件結(jié)構(gòu)。

頁(yè)面視圖小部件需要在應(yīng)用程序中實(shí)現(xiàn)圖像滑動(dòng)功能和圖像視圖以顯示實(shí)際圖像。除此之外,您需要一個(gè)容器小部件來(lái)在滑塊底部實(shí)現(xiàn)頁(yè)面指示器。

使用 PageView 小部件創(chuàng)建輪播

首先,讓我們創(chuàng)建一個(gè)名為 Carousel 的有狀態(tài)小部件。這是我們將用來(lái)實(shí)現(xiàn)輪播的小部件。 首先,讓我們創(chuàng)建一個(gè)包含圖像 URL 的列表:

List images = [

"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQTIZccfNPnqalhrWev-Xo7uBhkor57_rKbkw&usqp=CAU",

"https://wallpaperaccess.com/full/2637581.jpg"

];

現(xiàn)在您可以使用 PageView 小部件構(gòu)建器方法來(lái)創(chuàng)建輪播頁(yè)面:

PageView.builder(

itemCount: 2,

pageSnapping: true,

itemBuilder: (context,pagePosition){

return Container(

margin: EdgeInsets.all(10),

child: Image.network());

})

??itemCount???代表頁(yè)數(shù),它會(huì)決定??itemBuilder??需要執(zhí)行多少次。因此,您可以通過(guò)訪(fǎng)問(wèn)它的索引來(lái)設(shè)置每個(gè)圖像 URL。

PageView.builder(

itemCount: 2,

pageSnapping: true,

itemBuilder: (context,pagePosition){

return Container(

margin: EdgeInsets.all(10),

child: Image.network(images[pagePosition]));

})

現(xiàn)在您可以在屏幕上看到這些圖像,并且可以滑動(dòng)這些圖像。

Flutter

如果您像這樣顯示圖像,用戶(hù)將不知道是否有更多圖像。因此,在顯示中間圖像的同時(shí)顯示左右圖像的一部分將改善圖像輪播的用戶(hù)體驗(yàn)。 首先,您應(yīng)該創(chuàng)建??PageController???并將其設(shè)置為我們的 PageView 小部件。此外,我添加了第三張圖像并更改了??itemCount???從圖像數(shù)組本身的長(zhǎng)度獲取計(jì)數(shù)。然后您可以設(shè)置該??viewportFraction???屬性??PageController??以顯示其他圖像的分?jǐn)?shù):

late PageController _pageController;

List images = [

"https://images.wallpapersden.com/image/download/purple-sunrise-4k-vaporwave_bGplZmiUmZqaraWkpJRmbmdlrWZlbWU.jpg",

"https://wallpaperaccess.com/full/2637581.jpg",

"https://uhdwallpapers.org/uploads/converted/20/01/14/the-mandalorian-5k-1920x1080_477555-mm-90.jpg"

];



@override

void initState() {

super.initState();

_pageController = PageController(viewportFraction: 0.8);

}



@override

Widget build(BuildContext context) {

return PageView.builder(

itemCount: images.length,

pageSnapping: true,

controller: _pageController,

onPageChanged: (page) {

setState(() {

activePage = page;

});

},

itemBuilder: (context, pagePosition) {

return Container(

margin: EdgeInsets.all(10),

child: Image.network(images[pagePosition]),

);

});

}

盡管圖像顯示在 PageView 的中間,但它實(shí)際上占用了整個(gè)屏幕空間。如果您將??fit???類(lèi)型更改為??cover??,您可以看到它占據(jù)了整個(gè)屏幕。

要控制它,您可以將小部件包裝在小??SizedBox??部件中:

SizedBox(

height: 200,

width: MediaQuery.of(context).size.width,

child: PageView.builder(

itemCount: images.length,

pageSnapping: true,

controller: _pageController,

onPageChanged: (page) {

setState(() {

activePage = page;

});

},

itemBuilder: (context, pagePosition) {

return Container(

margin: EdgeInsets.all(10),

child: Image.network(images[pagePosition],fit: BoxFit.cover,),

);

}),

)

控制初始頁(yè)面

輪播在第一次加載時(shí)將第一張圖片加載為默認(rèn)頁(yè)面。但是如果您需要更改初始圖像以從不同的頁(yè)面開(kāi)始,您可以??initialPage ??在 PageController 中提供該屬性。它接受索引作為一個(gè)位置:

_pageController = PageController(viewportFraction: 0.8,initialPage: 1);

添加位置指示器

首先,將??PageView???小部件移動(dòng)到小部件??SizedBox???內(nèi)部??Column??:

Column(

children: [

SizedBox(

width: MediaQuery.of(context).size.width,

height: 200,

child: PageView.builder(

itemCount: images.length,

pageSnapping: true,

controller: _pageController,

onPageChanged: (page) {

setState(() {

activePage = page;

});

},

itemBuilder: (context, pagePosition) {

return Container(

margin: EdgeInsets.all(10),

child: Image.network(images[pagePosition]),

);

}),

),

],

)

然后您可以創(chuàng)建一個(gè)方法來(lái)返回指標(biāo)列表,您應(yīng)該根據(jù)當(dāng)前活動(dòng)位置更改指標(biāo)的顏色。因此,讓我們創(chuàng)建一個(gè)接受??currentIndex??? 和??imagesLength??作為參數(shù)的方法。通過(guò)檢查索引,您可以更改活動(dòng)位置指示器的顏色,如下所示:

List indicators(imagesLength,currentIndex) {

return List.generate(imagesLength, (index) {

return Container(

margin: EdgeInsets.all(3),

width: 10,

height: 10,

decoration: BoxDecoration(

color: currentIndex == index ? Colors.black : Colors.black26,

shape: BoxShape.circle),

);

});

}

當(dāng)用戶(hù)滑動(dòng)圖像時(shí),應(yīng)該有一種方法可以獲取當(dāng)前活動(dòng)位置。該??onPageChanged??方法適用于:

int activePage = 1;



PageView.builder(

itemCount: images.length,

pageSnapping: true,

controller: _pageController,

onPageChanged: (page) {

setState(() {

activePage = page;

});

})

現(xiàn)在您可以將??activePage???值傳遞給我們創(chuàng)建的方法。在小部件內(nèi)創(chuàng)建一個(gè) Row 小??Column???部件作為第二個(gè)孩子。然后,您可以將方法的返回指示符??indicators???作為子項(xiàng)分配給??Row??小部件:

Row(

mainAxisAlignment: MainAxisAlignment.center,

children: indicators(images.length,activePage))

為滑動(dòng)圖像添加動(dòng)畫(huà)

盡管我們的輪播效果很好,但在圖像之間滑動(dòng)時(shí)有動(dòng)畫(huà)效果還是不錯(cuò)的。讓我們看看如何在圖像變化時(shí)添加動(dòng)畫(huà)。 有多種方法可用于應(yīng)用放大動(dòng)畫(huà)。但是在這里我們將使用內(nèi)置的 Flutter??AnimationContainer??? 小部件來(lái)創(chuàng)建這個(gè)動(dòng)畫(huà),因?yàn)樗_(kāi)箱即用,??AnimationContainer???提供了我們需要的所有功能。 在當(dāng)前滑塊圖像中,所有容器的大小都相同。通過(guò)更改圖像的邊距,您可以添加放大效果。 ??AnimationContainer???包含樣特性?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/125507.html

相關(guān)文章

  • #yyds干貨盤(pán)點(diǎn)#Flutter 如何禁止手機(jī)橫屏[Flutter專(zhuān)題32]

    摘要:最后如果不起作用,可以分別做如下設(shè)置干貨盤(pán)點(diǎn)如何禁止手機(jī)橫屏專(zhuān)題橫屏安卓如下所示干貨盤(pán)點(diǎn)如何禁止手機(jī)橫屏專(zhuān)題另外上有個(gè)插件可以去試一下,我在這兒就不做解釋了。 這里是堅(jiān)果前端小課堂,歡迎關(guān)注公眾號(hào)堅(jiān)果前端,問(wèn)題引出 群友發(fā)來(lái)問(wèn)題: Flutter 怎么禁止橫屏顯示呀,網(wǎng)上說(shuō)的幾個(gè)方法 都沒(méi)有效 ...

    番茄西紅柿 評(píng)論0 收藏2637
  • Flutter 專(zhuān)題】22 圖解 PopupMenu 那些事兒 #yyds干貨盤(pán)點(diǎn)#

    摘要:默認(rèn)高度同樣是,水平布局使用復(fù)選標(biāo)記是圖標(biāo),顯示在位置同時(shí)只有在狀態(tài)為選中時(shí)才會(huì)顯示圖標(biāo)。分割線(xiàn)是一條水平分割線(xiàn),注意數(shù)組要使用父類(lèi),配合其他樣式共同使用。如果個(gè)數(shù)過(guò)多也無(wú)需擔(dān)心,支持默認(rèn)超過(guò)屏幕滑動(dòng)效果。 小菜需要處理標(biāo)題欄彈出對(duì)話(huà)框 PopupMenu 樣式,F(xiàn)lutter 當(dāng)然提供了一些處理方式,類(lèi)似 P...

    番茄西紅柿 評(píng)論0 收藏2637
  • Flutter 專(zhuān)題】19 圖解【分享頁(yè)面】底部對(duì)話(huà)框 #yyds干貨盤(pán)點(diǎn)#

    摘要:小菜在學(xué)習(xí)過(guò)程中需要處理一個(gè)類(lèi)似中效果的分享彈框頁(yè)??此坪芎?jiǎn)單的頁(yè)面,里面卻有很多值得嘗試的地方。每行個(gè)數(shù)列間距,即左右間距行間距,即上下間距寬高比,默認(rèn)注意設(shè)置個(gè)數(shù)與列間距的配合,如果太大可能會(huì)造成頁(yè)面展示不全等異常情況。 小菜在學(xué)習(xí) Flutter 過(guò)程中需要處理一個(gè)類(lèi)似 Android 中 PopupWi...

    番茄西紅柿 評(píng)論0 收藏2637
  • Flutter 專(zhuān)題】15 圖解 ListView 異步加載數(shù)據(jù)與等待 #yyds干貨盤(pán)點(diǎn)#

    摘要:小菜前兩天再學(xué)時(shí),整理了一下在列表中展示多種不同樣式,今天繼續(xù)深入學(xué)習(xí)異步請(qǐng)求數(shù)據(jù)并加載新聞列表以及初始進(jìn)入頁(yè)面的等小知識(shí)點(diǎn)。小菜剛接觸時(shí)間不長(zhǎng),還有很多不清楚和不理解的地方,如果又不對(duì)的地方還希望多多指出。 小菜前兩天再學(xué) ListView 時(shí),整理了一下在列表中展示多種不同 item 樣式,今天繼續(xù)深入學(xué)習(xí)...

    番茄西紅柿 評(píng)論0 收藏2637
  • flutter 中的列表的性能優(yōu)化續(xù)集#yyds干貨盤(pán)點(diǎn)#

    重新構(gòu)建嵌套列表這一節(jié)使用 Slivers 而不是 ListViews 重建相同的 UI。前奏在這里??https://blog.51cto.com/jianguo/4653002??使用 Slivers 的列表列表下面的代碼構(gòu)建了與之前相同的 UI,但這次它使用??Slivers?? 而不是收縮包裝??ListView??對(duì)象。本頁(yè)的其余部分將引導(dǎo)您逐步完成更改。如何將嵌套列表遷移到 Slive...

    番茄西紅柿 評(píng)論0 收藏2637

發(fā)表評(píng)論

0條評(píng)論