Flutter 剪裁組件的使用
效果展示
在實(shí)際項(xiàng)目當(dāng)中我們經(jīng)常看到如下各種剪裁形狀的效果,F(xiàn)lutter 為我們提供了非常方便的 Widget 很輕松就可以實(shí)現(xiàn),下面我們來(lái)一起看看吧
剪裁 Widget
ClipRRect(圓角矩形剪裁)
這里我們通過(guò) borderRadius 屬性就可以很方便的設(shè)置圓角半徑來(lái)實(shí)現(xiàn)圓角剪裁
ClipRRect( borderRadius: BorderRadius.circular(20), child: Image.network( img1, height: height, ), ),
其他屬性
大概瞅一眼就可以看到 ClipRRect 的屬性就 5 個(gè),這里我們需要調(diào)整的可能就 1~3 個(gè)
- borderRadius 圓角半徑
- clipper 自定義圓角矩形剪裁
- clipBehavior 剪裁方式
- Clip.none 不剪裁
- Clip.hardEdge 不進(jìn)行抗鋸齒剪裁
- Clip.antiAlias 默認(rèn)-抗鋸齒剪裁
- Clip.antiAliasWithSaveLayer 抗鋸齒并且合成層剪裁(這種模式不僅有抗鋸齒,還分配一個(gè)離屏緩存,后續(xù)的剪裁都在緩沖區(qū)進(jìn)行)
其他形狀剪裁
這里我們通過(guò)設(shè)置四個(gè)角的 borderRadius 可以達(dá)到不同的形狀效果,下面就具體來(lái)看看
葉子形狀
ClipRRect( borderRadius: BorderRadius.only( // 設(shè)置左下角半徑為 40 bottomLeft: Radius.circular(40), // 設(shè)置右上角半徑為 40 topRight: Radius.circular(40), ), child: ..., ),
“狗屋”形狀
ClipRRect( borderRadius: BorderRadius.vertical( // 設(shè)置頂部半徑為 40 top: Radius.circular(40), // 設(shè)置低部半徑為 10 bottom: Radius.circular(10), ), child: ..., ),
更多創(chuàng)意效果等你來(lái)發(fā)揮
ClipOval(橢圓剪裁)
如果你的子組件是長(zhǎng)方形,那么剪裁出來(lái)就是一個(gè)橢圓形
ClipOval( child: Image.network( img1, // 僅設(shè)置了高度,原始圖片是長(zhǎng)方形 height: height, ), ),
如果你的子組件是正方形,那么剪裁出來(lái)就是一個(gè)圓形
// 定義的寬高相等 var width = 100.0; var height = 100.0; ClipOval( child: Image.network( img1, width: width, height: height, // 縮放 fit: BoxFit.cover, ), ),
其他屬性
這里只有 clipper、clipBehavior ,與上面 ClipRRect 的屬性意思相同,不過(guò)多說(shuō)明了
ClipRect(矩形剪裁)
這個(gè)很少用到,暫時(shí)沒(méi)有找到應(yīng)用場(chǎng)景,就不過(guò)多說(shuō)明了,你找到的話可以評(píng)論告訴我哦,我會(huì)及時(shí)更新上來(lái)的
ClipPath(路徑剪裁)
這個(gè)讓你發(fā)揮的自由度就更多了,比如 ⭐️五角星、❤️愛(ài)心、優(yōu)惠券卡片 以及上面👆🏻所有的形狀都可以用路徑剪裁來(lái)實(shí)現(xiàn),下面我們就實(shí)現(xiàn)一個(gè)底部曲線剪裁 的效果
ClipPath( // 這里需要給 clipper 傳遞一個(gè) CustomClipper<Path> clipper: ClipperPath(), child: Image.network( img1, height: height, ), ),
這里是創(chuàng)建曲線剪裁路徑,看了下面的代碼你就知道上面的其他剪裁 Widget 的 clipper 怎么使用了
下面代碼注釋非常詳細(xì),仔細(xì)看哦
/// 創(chuàng)建剪裁路徑 class ClipperPath extends CustomClipper<Path> { @override Path getClip(Size size) { var path = Path(); // 連接到距離左上角3/4處 path.lineTo(0.0, size.height / 2); // 第一個(gè)控制點(diǎn) var firstControlPoint = Offset(0, size.height); // 目標(biāo)點(diǎn)是底部中間點(diǎn) var firstPoint = Offset(size.width / 2, size.height); path.quadraticBezierTo(firstControlPoint.dx, firstControlPoint.dy, firstPoint.dx, firstPoint.dy); // 第二個(gè)控制點(diǎn) var secondControlPoint = Offset(size.width, size.height); // 目標(biāo)點(diǎn)是右上角 3/4 處 var secondPoint = Offset(size.width, size.height / 2); path.quadraticBezierTo(secondControlPoint.dx, secondControlPoint.dy, secondPoint.dx, secondPoint.dy); // 連接到右上角 path.lineTo(size.width, 0.0); // 閉合 path.close(); // 返回剪裁路徑 return path; } @override bool shouldReclip(CustomClipper<Path> oldClipper) => oldClipper.hashCode != this.hashCode; }
Tips:剪裁路徑的開(kāi)銷(xiāo)很大,對(duì)于某些形狀,建議選擇上面經(jīng)過(guò)優(yōu)化的 Widget 使用
做個(gè)優(yōu)化
聰明的你一定發(fā)現(xiàn),我們通過(guò) ClipRRect 就可以實(shí)現(xiàn)這個(gè)效果,為啥還要寫(xiě)這么多代碼呢?來(lái),看效果,上代碼
ClipRRect( borderRadius: BorderRadius.vertical( // 底部圓角半徑設(shè)置為 60 bottom: Radius.circular(60), ), child: Image.network( img1, height: height, ), ),
源碼倉(cāng)庫(kù)
基于 Flutter 🔥 最新版本
Flutter Widgets 倉(cāng)庫(kù)
參考鏈接
ClipRRect (Flutter Widget of the Week)
Flutter-ClipRRect
Flutter-ClipRect
Flutter-ClipOval
Flutter-ClipPath
Flutter-CustomClipper
以上就是Flutter 剪裁組件的使用的詳細(xì)內(nèi)容,更多關(guān)于Flutter 剪裁組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
- 這篇文章主要為大家詳細(xì)介紹了Android中Handler機(jī)制的使用,文中的示例代碼講解詳細(xì),有需要的朋友可以借鑒參考下,希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2022-11-11
Android自定義頂部導(dǎo)航欄控件實(shí)例代碼
這篇文章主要介紹了Android自定義頂部導(dǎo)航欄控件實(shí)例代碼,需要的朋友可以參考下2017-12-12Android調(diào)用系統(tǒng)圖片裁剪限定尺寸及7.0照相問(wèn)題的解決方法
這篇文章主要介紹了Android調(diào)用系統(tǒng)圖片裁剪限定尺寸,及7.0照相問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android利用SoundPool實(shí)現(xiàn)音樂(lè)池
這篇文章主要為大家詳細(xì)介紹了Android利用SoundPool實(shí)現(xiàn)音樂(lè)池,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Android SharedPreferences數(shù)據(jù)存儲(chǔ)詳解
SharedPreferences是安卓平臺(tái)上一個(gè)輕量級(jí)的存儲(chǔ)類(lèi),用來(lái)保存應(yīng)用的一些常用配置,比如Activity狀態(tài),Activity暫停時(shí),將此activity的狀態(tài)保存到SharedPereferences中;當(dāng)Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時(shí),再?gòu)腟haredPreferences中將值取出2022-11-11Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫(huà)效果(一)
這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)動(dòng)畫(huà)效果的第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08Android控件系列之RadioButton與RadioGroup使用方法
本文介紹了Android中如何使用RadioGroup和RadioButton,對(duì)比了RadioButton和CheckBox的區(qū)別,并實(shí)現(xiàn)了自定義的RadioGroup中被選中RadioButton的變更監(jiān)聽(tīng)事件2012-11-11Android中閃屏實(shí)現(xiàn)方法小結(jié)(普通閃屏、倒計(jì)時(shí)閃屏、倒計(jì)時(shí)+動(dòng)畫(huà)閃屏)
這篇文章主要介紹了Android中閃屏實(shí)現(xiàn)方法小結(jié)(普通閃屏、倒計(jì)時(shí)閃屏、倒計(jì)時(shí)+動(dòng)畫(huà)閃屏),非常不錯(cuò),代碼簡(jiǎn)單易懂,需要的朋友可以參考下2017-01-01Android自定義view實(shí)現(xiàn)拖動(dòng)小球移動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android自定義view實(shí)現(xiàn)拖動(dòng)小球移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11最新評(píng)論