基于Flutter制作一個心碎動畫特效
前言
繼續(xù)動畫探索,今天用Flutter制作一個心碎的感覺,靈感來源于今天的股市,哎,心哇涼哇涼的。廢話不多說,開始。
效果圖先上:

實現(xiàn)步驟
1、繪制一個心
首先我們使用兩段三階貝塞爾曲線制作一個心型,這里因為需要實現(xiàn)心碎的效果,所以我們需要將心的兩段用兩段路徑path進行繪制出來,效果:

繪制代碼:
canvas.translate(size.width / 2, size.height / 2);
Paint paint = Paint();
paint
..style = PaintingStyle.stroke
..strokeWidth = 2
..color = Colors.black87;
Path path = Path();
path.moveTo(0, 0);
path.cubicTo(-200, -80, -60, -240, 0, -140);
path.close();
Path path2 = Path();
canvas.save();
canvas.drawPath(
path,
paint
..color = Colors.red
..style = PaintingStyle.stroke);
canvas.restore();
path2.cubicTo(200, -80, 60, -240, 0, -140);
path2.close();
canvas.drawPath(
path2,
paint..color = Colors.black87);2、繪制心的裂痕
我們看到心確實分成兩半了,但是中間還缺少裂痕,接下來我們就繪制心碎的裂痕,也很簡單,在兩段路徑path閉合前進行繪制線,效果:

繪制代碼:
path.relativeLineTo(-10, 30); path.relativeLineTo(20, 5); path.relativeLineTo(-20, 30); path.relativeLineTo(20, 20); path.relativeLineTo(-10, 20); path.relativeLineTo(10, 10); path2.relativeLineTo(-10, 30); path2.relativeLineTo(20, 5); path2.relativeLineTo(-20, 30); path2.relativeLineTo(20, 20); path2.relativeLineTo(-10, 20); path2.relativeLineTo(10, 10);
OK,我們已經(jīng)看到心已經(jīng)有了裂痕,如何心碎,只需將畫布進行翻轉(zhuǎn)一定角度即可,這里我們將畫布翻轉(zhuǎn)45°,看下效果:
左邊:

右邊:

3、加入動畫
已經(jīng)有心碎的感覺了,接下來加入動畫元素讓心碎的過程動起來。
思路: 我們可以想一下,心碎的過程是什么樣子,心的顏色慢慢變灰,心然后慢慢裂開,下方的動畫運動曲線看起來更符合心碎的過程,里面有不舍,不甘,但最后心還是慢慢的碎了。

我們把畫筆進行填充將這個動畫加入進來看下最終效果。

是不是心碎了一地。
知識點: 這里我們需要找到紅色和灰色的RGB色值,通過Color.fromRGBO(r, g, b, opacity)方法賦值顏色的色值。然后通過動畫值改變RGB的值即可。 這里我使用的色值是:
紅色:Color.fromRGBO(255, 0, 0, 1)灰色:Color.fromRGBO(169, 169, 169, 1)
完整代碼
class XinSui extends StatefulWidget {
const XinSui({Key? key}) : super(key: key);
@override
_XinSuiState createState() => _XinSuiState();
}
class _XinSuiState extends State<XinSui> with SingleTickerProviderStateMixin {
late AnimationController _controller =
AnimationController(vsync: this, duration: Duration(milliseconds: 4000))
..repeat();
late CurvedAnimation cure =
CurvedAnimation(parent: _controller, curve: Curves.bounceInOut);
late Animation<double> animation =
Tween<double>(begin: 0.0, end: 1.0).animate(cure);
@override
Widget build(BuildContext context) {
return Container(
child: CustomPaint(
size: Size(double.infinity, double.infinity),
painter: _XinSuiPainter(animation),
),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
}
class _XinSuiPainter extends CustomPainter {
Animation<double> animation;
_XinSuiPainter(this.animation) : super(repaint: animation);
@override
void paint(Canvas canvas, Size size) {
canvas.translate(size.width / 2, size.height / 2);
Paint paint = Paint();
paint
..style = PaintingStyle.stroke
..strokeWidth = 2
..color = Colors.black87;
Path path = Path();
path.moveTo(0, 0);
path.cubicTo(-200, -80, -60, -240, 0, -140);
path.relativeLineTo(-10, 30);
path.relativeLineTo(20, 5);
path.relativeLineTo(-20, 30);
path.relativeLineTo(20, 20);
path.relativeLineTo(-10, 20);
path.relativeLineTo(10, 10);
path.close();
Path path2 = Path();
canvas.save();
canvas.rotate(-pi / 4 * animation.value);
canvas.drawPath(
path,
paint
..color = Colors.red
..color = Color.fromRGBO(
255 - (86 * animation.value).toInt(),
(animation.value * 169).toInt(),
(animation.value * 169).toInt(),
1)
..style = PaintingStyle.fill);
canvas.restore();
path2.cubicTo(200, -80, 60, -240, 0, -140);
path2.relativeLineTo(-10, 30);
path2.relativeLineTo(20, 5);
path2.relativeLineTo(-20, 30);
path2.relativeLineTo(20, 20);
path2.relativeLineTo(-10, 20);
path2.relativeLineTo(10, 10);
path2.close();
canvas.rotate(pi / 4 * animation.value);
canvas.drawPath(
path2,paint);
}
@override
bool shouldRepaint(covariant _XinSuiPainter oldDelegate) {
return oldDelegate.animation != animation;
}
}小結(jié)
動畫曲線Curves配合繪制可以實現(xiàn)很多好玩的東西,這個需要勤加練習方能掌握,僅將此心碎獻給今天受傷的股民朋友們
到此這篇關(guān)于基于Flutter制作一個心碎動畫特效的文章就介紹到這了,更多相關(guān)Flutter心碎動畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jetpack?Compose?實現(xiàn)一個圖片選擇框架功能
這篇文章主要介紹了Jetpack?Compose?實現(xiàn)一個圖片選擇框架,本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
詳解如何使用Android Studio開發(fā)Gradle插件
這篇文章主要介紹了詳解如何使用Android Studio開發(fā)Gradle插件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
移動端android上line-height不居中的問題的解決
現(xiàn)在越來越多的移動界面使用rem適配,最近發(fā)現(xiàn)了移動端android上line-height不居中的問題,今日就來介紹一下解決的方法,非常具有實用價值,需要的朋友可以參考下2018-03-03
android基于SwipeRefreshLayout實現(xiàn)類QQ的側(cè)滑刪除
本篇文章主要介紹了android基于SwipeRefreshLayout實現(xiàn)類QQ的側(cè)滑刪除,非常具有實用價值,需要的朋友可以參考下2017-10-10
Android之scrollview滑動使標題欄漸變背景色的實例代碼
這篇文章主要介紹了Android之scrollview滑動使標題欄漸變背景色的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05

