Flutter - 繪制彎曲的虛線

在本文中碱工,我們將繪制如下的彎曲虛線:

我想你已經(jīng)熟悉了如何在Flutter中繪制自定義形狀和線條。如果沒有,你可以閱讀我在這個(gè)主題上寫的文章棘街。

讓我們開始創(chuàng)建我們的主文件:

main.dart

import 'package:custom_shape/pages/drawing_page.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Drawing Shapes",
      home: DrawingPage(),
    );
  }
}

繪圖將在DrawingPage課堂上進(jìn)行:

drawing_page.dart

import 'package:curved_line/curve_painter.dart';
import 'package:flutter/material.dart';

class DrawingPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Curved Line"),
      ),
      body: CustomPaint(
        painter: CurvePainter(),
        child: Container(),
      ),
    );
  }
}

像往常一樣蟆盐,我們的頁(yè)面首先Scaffold有一個(gè)appBar和一個(gè)body設(shè)置為CustomPaint小部件實(shí)例的頁(yè)面。

Container我使用的空(對(duì)于child屬性)將擴(kuò)展并填充整個(gè)屏幕遭殉,因此我們的大小canvas將與整個(gè)屏幕一樣大(再次石挂,如果你不明白為什么,請(qǐng)閱讀我在這個(gè)主題上寫的文章)险污。

這是CurvePainter類:

curve_painter.dart

import 'package:flutter/material.dart';

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

  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return false;
  }
}

我們將實(shí)現(xiàn)paint繪制曲線的方法痹愚。

要繪制貝塞爾線,我們需要四個(gè)點(diǎn):起點(diǎn)蛔糯,終點(diǎn)兩個(gè)控制點(diǎn)拯腮,如下圖所示。移動(dòng)控制點(diǎn)會(huì)改變曲線的斜率蚁飒。您可以在此在線工具中使用控制點(diǎn)动壤。

我們可以使用類PathcubicTo方法繪制貝塞爾曲線:

void cubicTo(double x1, double y1, double x2, double y2, double x3, double y3)

使用控制點(diǎn)(x1,y1)和(x2淮逻,y2)添加從當(dāng)前點(diǎn)到給定點(diǎn)(x3琼懊,y3)的曲線的三次貝塞爾曲線段。

如您所見弦蹂,該cubicTo方法接受三個(gè)參數(shù)肩碟。其中兩個(gè)是控制點(diǎn),最后一個(gè)參數(shù)是終點(diǎn)凸椿。起點(diǎn)是您的筆已經(jīng)位于畫布上的位置削祈。

不要忘記在畫布坐標(biāo)中,左上角是(0,0)點(diǎn)脑漫,右下角是(size.width髓抑,size.height)。因此优幸,請(qǐng)嘗試相應(yīng)地調(diào)整四點(diǎn):

curve_painter.dart

void paint(Canvas canvas, Size size) {

  var paint = Paint();

  paint.color = Colors.lightBlue;
  paint.style = PaintingStyle.stroke;
  paint.strokeWidth = 3;

  var startPoint = Offset(0, size.height / 2);
  var controlPoint1 = Offset(size.width / 4, size.height / 3);
  var controlPoint2 = Offset(3 * size.width / 4, size.height / 3);
  var endPoint = Offset(size.width, size.height / 2);

  var path = Path();
  path.moveTo(startPoint.dx, startPoint.dy);
  path.cubicTo(controlPoint1.dx, controlPoint1.dy,
      controlPoint2.dx, controlPoint2.dy,
      endPoint.dx, endPoint.dy);

  canvas.drawPath(path, paint);
}

請(qǐng)記住吨拍,paint對(duì)象就像我們的筆,我們將其顏色設(shè)置為藍(lán)色网杆,寬度設(shè)置為3羹饰。

我們用path對(duì)象描述了bezier路徑。該moveTo方法已用于將筆移動(dòng)到路徑的起??點(diǎn)碳却。然后我們調(diào)用cubicTo方法來(lái)定義控制點(diǎn)和終點(diǎn)队秩。之后,我們使用該drawPath方法繪制了路徑昼浦。嘗試更改已定義點(diǎn)的xy馍资,并查看曲線形狀如何變化:

虛線路徑

為了將任何正常路徑轉(zhuǎn)換為虛線路徑,幸運(yùn)的是关噪,可以在此處使用第三方包鸟蟹。它被稱為路徑繪圖乌妙。

要使用此包,首先將其添加到pubspec.yml項(xiàng)目文件的依賴項(xiàng)部分(包版本當(dāng)前為0.4.0):

pubspec.yaml

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  path_drawing: ^0.4.0

然后運(yùn)行“flutter packages get”命令獲取新包建钥。

現(xiàn)在導(dǎo)入文件中的以下curve_painter.dart文件:

import 'package:path_drawing/path_drawing.dart';

并在繪制之前將其包裝pathdashPath方法中:
curve_painter.dart

canvas.drawPath(
  dashPath(
    path,
    dashArray: CircularIntervalList<double>(<double>[15.0, 10.5]),
  ),
  paint,
);

dashPath方法有兩個(gè)參數(shù)藤韵。第一個(gè)是您想要被破折的路徑,第二個(gè)參數(shù)定義每個(gè)破折號(hào)的長(zhǎng)度(15.0)以及每?jī)蓚€(gè)破折號(hào)(10.0)之間的空間長(zhǎng)度锦针。使用這兩個(gè)數(shù)字進(jìn)行播放荠察,看看虛線是如何變化的置蜀。結(jié)果是:

好的伙計(jì)們奈搜,這就是今天的一切!

如果您想知道繪制這種線的用途是什么盯荤,您很快就會(huì)發(fā)現(xiàn)馋吗!在下一篇文章中,我將向您展示AnimationFlutter中的工作原理秋秤。我們將為餐館應(yīng)用程序?qū)崿F(xiàn)以下動(dòng)畫:

GitHub上提供了本文的源代碼宏粤。

謝謝閱讀!

轉(zhuǎn):https://medium.com/@meysam.mahfouzi/drawing-curved-dashed-lines-in-flutter-b5d0645b04c8

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灼卢,一起剝皮案震驚了整個(gè)濱河市绍哎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鞋真,老刑警劉巖崇堰,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涩咖,居然都是意外死亡海诲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門檩互,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)特幔,“玉大人,你說(shuō)我怎么就攤上這事闸昨◎撬梗” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵饵较,是天一觀的道長(zhǎng)拍嵌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)告抄,這世上最難降的妖魔是什么撰茎? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮打洼,結(jié)果婚禮上龄糊,老公的妹妹穿的比我還像新娘逆粹。我一直安慰自己,他們只是感情好炫惩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布僻弹。 她就那樣靜靜地躺著,像睡著了一般他嚷。 火紅的嫁衣襯著肌膚如雪蹋绽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天筋蓖,我揣著相機(jī)與錄音卸耘,去河邊找鬼。 笑死粘咖,一個(gè)胖子當(dāng)著我的面吹牛蚣抗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓮下,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翰铡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了讽坏?” 一聲冷哼從身側(cè)響起锭魔,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎路呜,沒想到半個(gè)月后迷捧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拣宰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年党涕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巡社。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膛堤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晌该,到底是詐尸還是另有隱情肥荔,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布朝群,位于F島的核電站燕耿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姜胖。R本人自食惡果不足惜誉帅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚜锨,春花似錦档插、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至氛悬,卻和暖如春则剃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背如捅。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工棍现, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伪朽。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓轴咱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親烈涮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容