Kotlin 開發第 24 天 Painter (Canvas)

  • 提供一個畫板,讓使用者可以通過手指在上面畫畫。
  • 可以將畫好的內容存到相簿當中。

Components

  • View
  • Canvas
  • File
  • Bitmap

在 Canvas 上畫圖

Paint 對象

Paint 對象用來定義畫筆的風格,比如顏色、粗細等等,比如

  • Paint.style – 繪製模式
  • paint.setColor(int Color) – 顏色
  • Paint.strokeWidth – 線條寬度
  • Paint.isAntiAlias – 抗鋸齒開關

可以到官方文件上查更多有關 CanvasPaint 的資料


PaintBoard

我們建立一個 View 來讓使用者可以在上面畫畫。

Canvas 雖然是一個畫布,但實際上繪畫過程中所產生的內容都是存在 Canvas 的 bitmap 屬性中。

所以我們這裡初始化了一個 bitmap 放到 Canvas 中,在之後也會使用這個 bitmap 來將畫好的圖片存到相簿中。

(如果對 ARGB_8888 有疑慮可以參考之前的文章


手勢處理

當使用者按下時紀錄 startX / startY 移動的過程中不斷把下一個點和前一個點連成線

並將新的位置更新到 startX / startY 上。

最後通過 invalidate() 方法通知調用 onDraw() 方法更新畫面。

saveBitmap

在 layout/activity_main.xml 中,引入 PaintBoard


BoardActivity

在 AndroidManifest.xml 中,加入存圖片的權限請求

判斷使用者是否同意保存圖片,如果尚未允許則跳出請求

當使用者點下 SAVE 的時候,將圖片存到主要儲存卡上

而圖片的檔名根據當下的時間產生一個檔名(如果是同一個檔名會覆蓋)。

在相簿裡面就會看到我們剛才畫好的內容


筆記

  • 研究:如何通過 Code 把 BaseBoard 放到 Activity 中,而不是通過 Layout(類似於 iOS 的 AddSubView)
  • TODO:畫板重置的實踐
  • API:後來聽朋友說,文件讀寫的功能如果要支援 API 24 以上的設備就需要使用 FileProvider 而不能直接  Uri.fromFile 不然會跳出 FileUriExposedException.

參考

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *