NotificationListener 可以監(jiān)聽 PageView 的改變,比如滑動(dòng)的距離,頁面索引等,目前只使用的了索引。里面的一些方法挺有用的。
我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、西陵ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的西陵網(wǎng)站制作公司
使用 AnimatedContainer 組件保證切換以后會(huì)有流程的過渡效果,表現(xiàn)的會(huì)平滑一些。
首先,返回?cái)?shù)據(jù)需要包含圖片的寬高信息,就像這樣:
如果返回的只有圖片信息沒有寬高數(shù)據(jù)可以使用以下方法去獲得圖片的信息,這樣也可以得到圖片的寬高信息,不太建議,還是直接叫后端給,我們也方便處理,要是后端說他們給不了就拿上磚頭去叫他們加,就想偷懶。
自適應(yīng)輪播圖的高度我們需要原始圖片的寬高比,或者知道原始圖的寬高。顯示的時(shí)候按照原始的寬高比進(jìn)行等比例縮放。
_controller.page 獲取到的是一個(gè)浮點(diǎn)數(shù),類似 1.0325441 ,使用 round 四舍五入出現(xiàn)的效果就是我們拖到一半或以上就可以得到下一個(gè) activeIndex , activeIndex 是一個(gè)整數(shù)。
我們動(dòng)態(tài)獲取了圖片的寬度以后放入 AnimatedContainer 就可以有過渡效果,真機(jī)和模擬器測試都很流暢,可以已60幀渲染。
Flutter中控件的高寬和字體大小時(shí),使用的是邏輯像素,并非是實(shí)際的物理像素。
flutter中的屏幕適配
假設(shè)設(shè)計(jì)圖的大小為1080 1920,上面一個(gè)圖片的高度為 80 90,則它在設(shè)備上的高寬為
對于android手機(jī),一般以寬度為基準(zhǔn)計(jì)算UI的高寬,因?yàn)閍ndroid手機(jī)的寬度一般就是750,1080等幾個(gè)尺寸,但是高的尺寸就有很多。
推薦一個(gè)別人封裝好的一個(gè)用于屏幕適配的庫
Flutter屏幕適配方案插件-完美解決屏幕適配
在Flutter中,我們可以使用Image控件來顯示圖片,一般來講我們的圖片資源都來源于網(wǎng)絡(luò)或者本地圖片。
Flutter中的Image也是類似。
我們先來看看Image的構(gòu)造方法
下面我們來看看其常用的屬性
可以看到,其常用屬性跟前端中的css很像。
下面我們來簡單用一用Image控件
首先是必填參數(shù)image,它接收一個(gè)ImageProvider類型的值。ImageProvider是一個(gè)抽象類,他下面有下圖這些實(shí)現(xiàn)類,由下面這些實(shí)現(xiàn)類可以看出,image是可以從資源,內(nèi)存,網(wǎng)絡(luò),和文件中獲取圖片。
我們先來試試加載網(wǎng)絡(luò)圖片
首先看看NetworkImage構(gòu)造方法,很簡單,傳個(gè)url就可以了
如下:
嗯,就是這么簡單。其他3種情況使用也是類似的,自行看源碼即可。
實(shí)際上,F(xiàn)lutter給我們提供了擴(kuò)展方法,使用起來更加簡單,通常我們直接使用提供的擴(kuò)展方法即可
如下
可以看到,他們的構(gòu)造方法基本類似。
所以我們也可以這樣寫,跟上面的效果是一致的。
大致分為一下幾步
1.創(chuàng)建一個(gè)文件夾,用于存放圖片,如圖,我創(chuàng)建了一個(gè)imgs的文件夾,放了一張圖片
2.在pubspec.yaml中聲明資源,注意聲明的時(shí)候路徑和前面的-是有間隔的,不然的話會(huì)報(bào)#/properties/flutter/properties/assets: type: wanted [array] got -imgs/code.png
類似的錯(cuò)誤,聲明完成后點(diǎn)擊右上方的packages get
或
下面我們再來看看其他屬性。
width,height
寬高沒什么好說的,就是設(shè)置寬度和高度
配合color使用,用于設(shè)置顏色的混合模式。BlendMode是一個(gè)枚舉,他有很多值
詳細(xì)解析還是看官方文檔吧,值太多了,我們隨便用用
用于設(shè)置圖片的填充方式,當(dāng)圖片本身小于設(shè)置的寬高或者比父控件的寬高小時(shí),我們可以設(shè)置該屬性控制圖片的顯示。
其值的類型是BoxFit。是個(gè)枚舉
具體含義還是直接看文檔即可
設(shè)置圖片的對齊方式,接收一個(gè)Alignment類型的值,值如下,很好理解
為了方便看效果我們在外邊套了個(gè)Container,簡單的把它理解為一個(gè)容器布局就可以了,類似于html中的div或android中的Layout,我們給Container設(shè)置了寬高和背景顏色。
bottomLeft效果如下,其他的自行嘗試
相對于Image,ICON可以像web一樣使用字體圖標(biāo),并且可以使用矢量圖,無需擔(dān)心失真的問題,并且體積相對較小。
我們先來看看其構(gòu)造方法
很簡單,我們直接來用一用
默認(rèn)情況下,pubspec.yaml中uses-material-design的值為true.我們默認(rèn)就可以使用Material Design字體圖標(biāo)
Image是一個(gè)用于展示圖片的組件。支持 JPEG、PNG、GIF、Animated GIF、WebP、Animated WebP、BMP 和 WBMP 等格式。
Image.asset - 用于從資源目錄的顯示圖片,需要在 pubspec.yaml 文件中聲明。
Image.network - 用于從網(wǎng)絡(luò)上顯示圖片。
Image.file - 用于從文件里顯示圖片。
Image.memory - 用于從內(nèi)存里(Uint8List)顯示圖片。
alignment → AlignmentGeometry - 圖像邊界內(nèi)對齊圖像。
centerSlice → Rect - 九片圖像的中心切片。
color → Color - 該顏色與每個(gè)圖像像素混合colorBlendMode。
colorBlendMode → BlendMode - 用于 color 與此圖像結(jié)合使用。
fit → BoxFit - 圖像在布局中分配的空間。
gaplessPlayback → bool - 當(dāng)圖像提供者發(fā)生變化時(shí),是繼續(xù)顯示舊圖像(true)還是暫時(shí)不顯示(false)。
image → ImageProvider - 要顯示的圖像。
matchTextDirection → bool - 是否在圖像的方向上繪制圖像 TextDirection。
repeat → ImageRepeat - 未充分容器時(shí),是否重復(fù)圖片。
height → double - 圖像的高度。
width → double - 圖像的寬度。
加載資源圖片需要將圖片資源放入工程中,例如:新建images文件夾,將圖片放在該文件夾下,圖片適配則是使用ios的方式1X,2X,3X:
然后在pubspec.yaml中配置assets:
加載資源/網(wǎng)絡(luò)/本地文件圖片/內(nèi)存圖片:
占位圖加載圖片:
圓形圖片:1.裁剪實(shí)現(xiàn) 2.CircleAvatar實(shí)現(xiàn) 3.Container邊框?qū)崿F(xiàn)
圓角圖片:1.裁剪實(shí)現(xiàn) 2.Container邊框?qū)崿F(xiàn)
BoxFit.contain 全圖居中顯示但不充滿,顯示原比例
BoxFit.cover 圖片可能拉伸,也可能裁剪,但是充滿容器
BoxFit.fill 全圖顯示且填充滿,圖片可能會(huì)拉伸
BoxFit.fitHeight 圖片可能拉伸,可能裁剪,高度充滿
BoxFit.fitWidth 圖片可能拉伸,可能裁剪,寬度充滿
BoxFit.scaleDown 效果和contain差不多, 但是只能縮小圖片,不能放大圖片
下一節(jié)學(xué)習(xí)基礎(chǔ)組件之Text