九乳讥、Flutter水波動畫

目錄
一柱查、效果展示
二、CustomPaint
三云石、CustomPainter
四唉工、水波效果
五、文字效果
六汹忠、動起來

一淋硝、效果展示

Flutter水波動畫.png

二、CustomPaint

WaterWave繼承CustomPainter用畫筆畫出來的水波動畫效果需要CustomPaint呈現出來宽菜。
CustomPaint有兩個參數painter和size谣膳,painter是一個繼承了CustomPainter的對象,主要實現了繪畫控件的功能铅乡。size指定了控件的大小继谚,如果CustomPaint的child不為空,size的值就是child控件的大小隆判,指定size的值則無效犬庇;如果child為空,所指定的size的值侨嘀,就是畫布的大小臭挽。

CustomPaint(
                painter: WaterWave(this.variable, 0.79, this.offsetX),
                size: Size(160, 160),
              )

三、CustomPainter

WaterWave繼承了CustomPainter咬腕,實現了其中兩個重要方法:paint和shouldRepaint欢峰。paint當自定義控件需要重畫時被調用。shouldRepaint則決定當條件變化時是否需要重畫。

class WaterWave extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
  }

  @override
  bool shouldRepaint(ClockPainter oldDelegate) {
    return true;
  }
}

四纽帖、水波效果

繪出水波效果有幾個重要的參數:波紋振幅:double waveAmplitude;
波紋周期:double waveCycle;波紋上升速度:double waveGrowth;
波浪x位移:double offsetX;當前波浪上市高度Y(高度從大到小 坐標系向下增長):double currentWavePointY; 模擬波紋:double variable;這幾個參數在sin函數和cos函數地計算下模擬出水波的形狀宠漩,然后畫出來。

void firstWave() {
    Path path = new Path();
    double y = this.currentWavePointY;
    path.moveTo(0, y);
    for (double x = 0.0; x <= this.waterWaveWidth; x++) {
      y = this.waveAmplitude * sin(this.waveCycle * x + this.offsetX) +
          this.currentWavePointY;
      path.lineTo(x, y);
    }
    path.lineTo(this.waterWaveWidth, this.size.height);
    path.lineTo(0, this.size.height);
    path.close();
    var paint = new Paint()
      ..color = Color.fromRGBO(223, 83, 64, 1)
      ..style = PaintingStyle.fill
      ..maskFilter = MaskFilter.blur(BlurStyle.inner, 5.0);
    this.canvas.drawPath(path, paint);
  }


void secondWave() {
    Path path = new Path();
    double y = this.currentWavePointY;
    path.moveTo(0, y);
    for (double x = 0.0; x <= this.waterWaveWidth; x++) {
      y = this.waveAmplitude * cos(this.waveCycle * x + this.offsetX) +
          this.currentWavePointY;
      path.lineTo(x, y);
    }
    path.lineTo(this.waterWaveWidth, this.size.height);
    path.lineTo(0, this.size.height);
    path.close();
    var paint = new Paint()
      ..color = Color.fromRGBO(236, 90, 66, 1)
      ..style = PaintingStyle.fill
      ..maskFilter = MaskFilter.blur(BlurStyle.inner, 5.0);
    this.canvas.drawPath(path, paint);
}

五懊直、文字效果

繪畫文字的時候需要添加引用扒吁,import 'dart:ui' as UI;

 UI.ParagraphBuilder pb = UI.ParagraphBuilder(UI.ParagraphStyle(
      textAlign: TextAlign.center,
      fontWeight: FontWeight.w500,
      fontStyle: FontStyle.normal,
      fontSize: 70.0,
    ));
    pb.pushStyle(UI.TextStyle(color: Colors.white));
    pb.addText('86');
    UI.Paragraph paragraph = pb.build();
    paragraph.layout(UI.ParagraphConstraints(width: 140));
    Offset offset = Offset(10, 30.0);
    this.canvas.drawParagraph(paragraph, offset);


    UI.ParagraphBuilder pb2 = UI.ParagraphBuilder(UI.ParagraphStyle(
      textAlign: TextAlign.center,
      fontWeight: FontWeight.w500,
      fontStyle: FontStyle.normal,
      fontSize: 18.0,
    ));
    pb2.pushStyle(UI.TextStyle(color: Colors.white));
    pb2.addText('評分');
    UI.Paragraph paragraph2 = pb2.build();
    paragraph2.layout(UI.ParagraphConstraints(width: 100));
    Offset offset2 = Offset(30, 105.0);
    this.canvas.drawParagraph(paragraph2, offset2);

六、動起來

重新initState方法室囊,添加一個定時器沒25毫秒改變一下水波的波紋雕崩。
variable模擬波紋上下浮動的效果,offsetX模擬波浪的位移融撞,從而能夠增強波紋震動的效果盼铁。

@override
  void initState() {
    super.initState();

    this.variable = widget.variable;
    this.increase = widget.increase;
    this.waveSpeed = 0.4 / pi;
    this.offsetX = 0.0;

    this.timer = Timer.periodic(new Duration(milliseconds: 25), (timer) {
      setState(() {
        this.offsetX += this.waveSpeed;

        if (this.increase) {
          this.variable += 0.01;
        } else {
          this.variable -= 0.01;
        }

        if (this.variable <= 1) {
          this.increase = true;
        }

        if (this.variable >= 1.6) {
          this.increase = false;
        }
      });
    });
  }
關注公眾號,查看更多內容.jpg
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末尝偎,一起剝皮案震驚了整個濱河市饶火,隨后出現的幾起案子,更是在濱河造成了極大的恐慌致扯,老刑警劉巖肤寝,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跑芳,死亡現場離奇詭異,居然都是意外死亡蘸朋,警方通過查閱死者的電腦和手機巴刻,發(fā)現死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恬口,“玉大人,你說我怎么就攤上這事∈蓝郑” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵呻征,是天一觀的道長耘婚。 經常有香客問我,道長陆赋,這世上最難降的妖魔是什么沐祷? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮攒岛,結果婚禮上赖临,老公的妹妹穿的比我還像新娘。我一直安慰自己灾锯,他們只是感情好兢榨,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般吵聪。 火紅的嫁衣襯著肌膚如雪凌那。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天吟逝,我揣著相機與錄音帽蝶,去河邊找鬼。 笑死块攒,一個胖子當著我的面吹牛嘲碱,可吹牛的內容都是我干的。 我是一名探鬼主播局蚀,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼麦锯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琅绅?” 一聲冷哼從身側響起扶欣,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎千扶,沒想到半個月后料祠,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡澎羞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年髓绽,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妆绞。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡顺呕,死狀恐怖,靈堂內的尸體忽然破棺而出括饶,到底是詐尸還是另有隱情株茶,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布图焰,位于F島的核電站启盛,受9級特大地震影響,放射性物質發(fā)生泄漏技羔。R本人自食惡果不足惜僵闯,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望藤滥。 院中可真熱鬧鳖粟,春花似錦、人聲如沸超陆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至张漂,卻和暖如春晶默,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背航攒。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工磺陡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漠畜。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓币他,卻偏偏與公主長得像,于是被迫代替她去往敵國和親憔狞。 傳聞我的和親對象是個殘疾皇子蝴悉,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容

  • 我們已經了解了Flutter中的剪裁,那么制作一個評分控件已經很簡單了瘾敢。先準備兩個版本的五角星拍冠,一個用于高亮展示分...
    秋分落葉閱讀 3,538評論 2 2
  • 1,從本篇文章/音頻/視頻中我學到的最重要的概念 劃分段落時簇抵,記敘文感覺比較難一點庆杜。快速閱讀第三單元...
    201吳曉歡閱讀 218評論 2 0
  • 最近股市比較火爆碟摆,我自己做了也比較久晃财,我在此將我的一些對市場的思考總結出來,和大家分享典蜕。從一個對話開始断盛。一次和同事...
    長頸猴閱讀 285評論 0 0
  • 今天是什么日子 起床:8:10 就寢:12:00 天氣:晴 心情:雜亂 紀念日:83天 叫我起床的不是鬧鐘是夢想 ...
    WILDATTENTION閱讀 166評論 0 1
  • 小時候熱愛文學,喜歡看書嘉裤,從小就有當作家的夢想郑临,那時候只知道能當作家是多么高尚多么光榮的事情⌒汲瑁可是因為不知道怎么樣...
    喜若盈盈閱讀 204評論 3 2