欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flutter實(shí)現(xiàn)支付寶集五福手畫福字功能

 更新時(shí)間:2022年01月23日 08:33:21   作者:?jiǎn)慰偛粫?huì)虧待你  
支付寶一年一度的集五福活動(dòng)又開(kāi)始了,其中包含了一個(gè)功能就是手寫福字,還包括撤銷一筆,清除重寫,保存相冊(cè)等。本文將介紹如何使用Flutter實(shí)現(xiàn)這些功能,感興趣的可以了解一下

需求

包含需求的具體有:

界面隨著用戶手指的滑動(dòng)顯示走過(guò)軌跡,也就是對(duì)應(yīng)的筆畫。

點(diǎn)擊清空按鈕可以清除所有的筆畫。

點(diǎn)擊撤銷按鈕可以清除上一步畫過(guò)的筆畫。

保存所寫的文字樣式到相冊(cè)。

實(shí)現(xiàn)思路

顯示筆畫軌跡

使用Listener組件對(duì)用戶手指落下、滑動(dòng)和收起的動(dòng)作進(jìn)行監(jiān)聽(tīng),在onPointerDown,onPointerMove,onPointerUp3個(gè)監(jiān)聽(tīng)方法中返回的PointerMoveEvent對(duì)象包含了手指所在的位置坐標(biāo)偏移量localPosition,用戶每次滑動(dòng)時(shí)都會(huì)記錄下軌跡經(jīng)過(guò)的坐標(biāo)點(diǎn),這些坐標(biāo)點(diǎn)連接起來(lái)就是一條線。其次,再配合使用CustomPainter進(jìn)行畫布自繪,將所有劃過(guò)的點(diǎn)的連接成線使用畫筆繪制在界面上即可。

搜集坐標(biāo)點(diǎn):

Listener(
  child: Container(
    alignment: Alignment.center,
    color: Colors.transparent,
    width: double.infinity,
    height: MediaQuery.of(context).size.height,
  ),
  onPointerDown: (PointerDownEvent event) {
    setState(() {
      
    });
  },
  onPointerMove: (PointerMoveEvent event) {
    setState(() {
      
    });
  },
  onPointerUp: (PointerUpEvent event) {
    setState(() {
      
    });
  },
),

繪制:

@override
void paint(Canvas canvas, Size size) {
  myPaint.strokeCap = StrokeCap.round;
  myPaint.strokeWidth = 15.0;
  if (lines.isEmpty) {
    canvas.drawPoints(PointMode.polygon, [Offset.zero, Offset.zero], myPaint);
  } else {
    for (int k = 0; k < lines.length; k++) {
      for (int i = 0; i < lines[k].length - 1; i++) {
        if (lines[k][i] != Offset.zero && lines[k][i + 1] != Offset.zero) {
          canvas.drawLine(lines[k][i], lines[k][i + 1], myPaint);
        }
      }
    }
  }
}

撤銷與清空

看到上面的代碼有的人可能會(huì)比較疑惑,繪制時(shí)為什么這么復(fù)雜,還出現(xiàn)了雙重循環(huán)。這就和撤銷功能有關(guān)了,先假設(shè)不需要撤銷功能,其實(shí)我們就可以直接把所有筆畫的點(diǎn)連接到一起進(jìn)行繪制就可以了,但是一旦引入了撤銷功能,就要記錄每一筆筆畫,福字筆畫是13畫,那么理論上是需要記錄13個(gè)筆畫的,才能保證每次撤銷時(shí)都能正常退回上一次畫過(guò)的筆跡,所以第一反應(yīng)就是使用集合將每一次筆畫記錄下來(lái)。而上面也說(shuō)了每一個(gè)筆畫其實(shí)也是多個(gè)坐標(biāo)點(diǎn)的集合,所以所有筆畫就是一個(gè)坐標(biāo)點(diǎn)集合的集合,即:

/// 所有筆畫劃線集合
List<List<Offset>> _lines = [];

另外,也不難想到,我們可以輕易通過(guò)手指按下和手指手指的方法回調(diào)來(lái)區(qū)分筆畫開(kāi)始和結(jié)束。在兩個(gè)方法中進(jìn)行筆畫的add和更新。

onPointerDown: (PointerDownEvent event) {
  setState(() {
    _event = event;
    _points.add(_event?.localPosition ?? Offset.zero);
    _lines.add(_points);
  });
},
onPointerMove: (PointerMoveEvent event) {
  setState(() {
    _event = event;
    _points.add(_event?.localPosition ?? Offset.zero);
    _lines.last = _points;
  });
},
onPointerUp: (PointerUpEvent event) {
  setState(() {
    _event = event;
    _points.add(Offset.zero);
    _lines.last = _points;
  });
  _points = [];
},

而前面說(shuō)的雙重遍歷這時(shí)也比較好理解了:

  • 第一層循環(huán)是遍歷所有的筆畫,遍歷次數(shù)就是福字的筆畫數(shù)。
  • 第二層循環(huán)是每一個(gè)筆畫包括的好多個(gè)坐標(biāo)點(diǎn),遍歷出來(lái)使用drawLine方法繪制到界面上形成一條線。

這樣在進(jìn)行撤銷操作時(shí),調(diào)用list的removeLast方法移除最后一項(xiàng)再刷新界面就能實(shí)現(xiàn)退回一筆的效果了,清空就是清空筆畫集合。

保存到相冊(cè)

保存相冊(cè)主要是引入了兩個(gè)插件庫(kù):permission_handlerimage_gallery_saver,一個(gè)用來(lái)獲取存儲(chǔ)權(quán)限,一個(gè)用來(lái)保存到相冊(cè)。 使用RepaintBoundary組件將畫布包裹起來(lái),并指定key,在點(diǎn)擊保存時(shí)按順序調(diào)用如下方法先獲取截圖后保存即可:

RenderRepaintBoundary boundary =
    key.currentContext!.findRenderObject() as RenderRepaintBoundary;
var image = await boundary.toImage(pixelRatio: 3.0);
ByteData? byteData = await image.toByteData(format: ImageByteFormat.png);
_postBytes = byteData?.buffer.asUint8List();
var result = await ImageGallerySaver.saveImage(_postBytes!);

完整代碼與demo下載

github地址

安卓手機(jī)掃碼下載

到此這篇關(guān)于Flutter實(shí)現(xiàn)支付寶集五福手畫福字功能的文章就介紹到這了,更多相關(guān)Flutter畫福字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android使用CardView作為RecyclerView的Item并實(shí)現(xiàn)拖拽和左滑刪除

    Android使用CardView作為RecyclerView的Item并實(shí)現(xiàn)拖拽和左滑刪除

    這篇文章主要介紹了Android使用CardView作為RecyclerView的Item并實(shí)現(xiàn)拖拽和左滑刪除,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • android利用handler實(shí)現(xiàn)打地鼠游戲

    android利用handler實(shí)現(xiàn)打地鼠游戲

    這篇文章主要為大家詳細(xì)介紹了android利用handler實(shí)現(xiàn)打地鼠游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Retrofit + OkHttp緩存處理的示例代碼

    Retrofit + OkHttp緩存處理的示例代碼

    本篇文章主要介紹了Retrofit + OkHttp緩存處理的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Android發(fā)送短信功能代碼

    Android發(fā)送短信功能代碼

    這篇文章主要介紹了Android發(fā)送短信功能代碼,并附有較為詳盡的代碼說(shuō)明,有助于讀者更好的理解代碼功能,需要的朋友可以參考下
    2014-09-09
  • android教程之使用popupwindow創(chuàng)建菜單示例

    android教程之使用popupwindow創(chuàng)建菜單示例

    這篇文章主要介紹了android使用popupwindow創(chuàng)建菜單的示例,需要的朋友可以參考下
    2014-02-02
  • Android studio報(bào)錯(cuò):The emulator process for AVD (xxx) was killed

    Android studio報(bào)錯(cuò):The emulator process for AVD (xxx) was kill

    這篇文章主要介紹了Android studio報(bào)錯(cuò):The emulator process for AVD (xxx) was killed,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Android圓形控件實(shí)現(xiàn)畫圓效果

    Android圓形控件實(shí)現(xiàn)畫圓效果

    這篇文章主要為大家詳細(xì)介紹了Android圓形控件實(shí)現(xiàn)畫圓效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android實(shí)現(xiàn)掃一掃識(shí)別數(shù)字功能

    Android實(shí)現(xiàn)掃一掃識(shí)別數(shù)字功能

    這篇文章主要介紹了Android實(shí)現(xiàn)掃一掃識(shí)別數(shù)字功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-09-09
  • Android之來(lái)電秀實(shí)戰(zhàn)示例

    Android之來(lái)電秀實(shí)戰(zhàn)示例

    這篇文章主要為大家介紹了Android之來(lái)電秀實(shí)戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Android 實(shí)現(xiàn)廣告歡迎界面(倒計(jì)時(shí))

    Android 實(shí)現(xiàn)廣告歡迎界面(倒計(jì)時(shí))

    前些時(shí)候就是別人問(wèn)我他的android APP怎么做一個(gè)廣告的歡迎界面,就是過(guò)幾秒后自動(dòng)跳轉(zhuǎn)到主界面的實(shí)現(xiàn)。下面通過(guò)本文給大家介紹Android 實(shí)現(xiàn)廣告歡迎界面(倒計(jì)時(shí))的方法,需要的朋友參考下吧
    2017-12-12

最新評(píng)論