Android實(shí)現(xiàn)流動(dòng)的漸變色邊框效果
前言
記得在介紹 motion_toast 一篇的時(shí)候,開(kāi)篇有一張動(dòng)圖,邊框是漸變色而且感覺(jué)是流動(dòng)的。這個(gè)動(dòng)效挺有趣的,當(dāng)時(shí)也有人問(wèn)怎么實(shí)現(xiàn),經(jīng)過(guò)上一篇《讓你的聊天氣泡豐富多彩!》后,有了實(shí)現(xiàn)思路了。
實(shí)現(xiàn)思路
首先要實(shí)現(xiàn)但是漸變色邊框,這個(gè)其實(shí)可以參考上一篇的CustomPaint
的漸變填充實(shí)現(xiàn)。繪制一個(gè)矩形邊框,然后讓漸變色的區(qū)域填充到矩形區(qū)域內(nèi)就可以了。
void paint(Canvas canvas, Size size) { final rectWidth = 300.0, rectHeight = 100.0; Rect rect = Offset( size.width / 2 - rectWidth / 2, size.height / 2 - rectHeight / 2) & Size(rectWidth, rectHeight); final paint = Paint() ..shader = LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: colors, ), ).createShader(rect) ..style = PaintingStyle.stroke ..strokeWidth = 8.0; canvas.drawRect(rect, paint); }
繪制出來(lái)的效果如下圖所示。
然后是讓漸變色流動(dòng)起來(lái),這里就需要?jiǎng)赢?huà)了,通過(guò)動(dòng)畫(huà)控制漸變填充的角度,周而復(fù)始就能夠形成不斷流動(dòng)的效果。這里還是要用到 LinearGradient
的transform
屬性。Flutter 內(nèi)置了一個(gè)GradientRotation
旋轉(zhuǎn)變換的類(lèi),正好可以進(jìn)行角度變換實(shí)現(xiàn)角度控制,GradientRotation 接收一個(gè)角度值實(shí)現(xiàn)對(duì)漸變的角度控制,下面是0度和90度的對(duì)比圖,可以看到0度到90度邊框的漸變色起始位置正好是旋轉(zhuǎn)了90度。
有了以上兩個(gè)基礎(chǔ),我們通過(guò)一個(gè) Animation 對(duì)象動(dòng)畫(huà)過(guò)程中的值來(lái)控制旋轉(zhuǎn)角度就可以了。
void paint(Canvas canvas, Size size) { final rectWidth = 300.0, rectHeight = 100.0; Rect rect = Offset( size.width / 2 - rectWidth / 2, size.height / 2 - rectHeight / 2) & Size(rectWidth, rectHeight); final paint = Paint() ..shader = LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: colors, transform: GradientRotation( animation * 2 * pi, ), //改變 transform 值實(shí)現(xiàn)漸變旋轉(zhuǎn)效果 ).createShader(rect) ..style = PaintingStyle.stroke ..strokeWidth = 8.0; canvas.drawRect(rect, paint); }
動(dòng)畫(huà)配置代碼如下,2秒旋轉(zhuǎn)一周,使用 Curves.linear
實(shí)現(xiàn)勻速旋轉(zhuǎn)。
class _GradientBoundDemoState extends State<GradientBoundDemo> with SingleTickerProviderStateMixin { late Animation<double> animation; late AnimationController controller; @override void initState() { super.initState(); controller = AnimationController(duration: const Duration(seconds: 2), vsync: this); animation = Tween<double>(begin: 0, end: 1.0).animate(CurvedAnimation( parent: controller, curve: Curves.linear, )) ..addListener(() { setState(() {}); }); controller.repeat(); } //... }
實(shí)現(xiàn)的效果如下所示。
調(diào)整一下顏色和 LinearGradient
的 begin
和 end
參數(shù),還可以實(shí)現(xiàn)一些有趣的效果。下面這個(gè)效果就和開(kāi)篇那個(gè)效果有點(diǎn)接近了。
如果是畫(huà)成圓圈邊框的話,做 Loading 效果其實(shí)也不錯(cuò)。
源碼已經(jīng)提交至:繪圖相關(guān)源碼,文件名為:gradient_bound_demo.dart
。
總結(jié)
本篇介紹了自定義繪制漸變色邊框,并通過(guò)動(dòng)畫(huà)實(shí)現(xiàn)流動(dòng)的效果,繪圖加動(dòng)畫(huà)組合能夠?qū)崿F(xiàn)很多既有創(chuàng)意又有取的效果,大家也可以嘗試一下看看有哪些有趣的玩法。
到此這篇關(guān)于Android實(shí)現(xiàn)流動(dòng)的漸變色邊框效果的文章就介紹到這了,更多相關(guān)Android漸變色邊框內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android自定義控件實(shí)現(xiàn)雷達(dá)圖效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)雷達(dá)圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09RecyclerView實(shí)現(xiàn)列表倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了RecyclerView實(shí)現(xiàn)列表倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Android 分析實(shí)現(xiàn)性能優(yōu)化之啟動(dòng)速度優(yōu)化
在移動(dòng)端程序中,用戶希望的是應(yīng)用能夠快速打開(kāi)。啟動(dòng)時(shí)間過(guò)長(zhǎng)的應(yīng)用不能滿足這個(gè)期望,并且可能會(huì)令用戶失望。輕則鄙視你,重則直接卸載你的應(yīng)用2021-11-11Android封裝高德地圖定位工具類(lèi)Util的詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于Android封裝高德地圖定位工具類(lèi)Util的相關(guān)資料,封裝成工具類(lèi)后非常方便以后的項(xiàng)目,可以直接使用,文中也給出了詳細(xì)的實(shí)例代碼,需要的朋友可以參考下2021-07-07Android開(kāi)發(fā)實(shí)現(xiàn)各種圖形繪制功能示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)各種圖形繪制功能,結(jié)合實(shí)例形式分析了Android圖形繪制常用的組件、函數(shù)使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-09-09Android Studio報(bào):“Attribute application@theme or @ icon ”問(wèn)題的解
這篇文章主要給大家介紹了關(guān)于Android Studio報(bào):“Attribute application@theme or @ icon ”問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12