昨日からの続きです
今日は各ボタンをタップした時の処理を編集します
// カラーチェンジメソッド fun ChangeColor(colorSelected: String) { when (colorSelected) { "black" -> color = Color.BLACK "red" -> color = Color.RED "blue" -> color = Color.BLUE } paint!!.color = color } // clearメソッド(初期化とキャンバスクリア) fun Clear() { pathList.clear() colorList.clear() repathList.clear() recolorList.clear() Initialize() canvas = surfaceHolder!!.lockCanvas() canvas?.drawColor(0, PorterDuff.Mode.CLEAR) surfaceHolder!!.unlockCanvasAndPost(canvas) } // undoメソッド fun Undo() { if (pathList.isEmpty()) { return } // Listからパスを取り出し、redoListに格納 val lastUndoPath = pathList.removeLast() repathList.add(lastUndoPath) val lastcolor = colorList.removeLast() recolorList.add(lastcolor) // ロックしてキャンバスを取得 canvas = surfaceHolder!!.lockCanvas() // キャンバスのクリア canvas!!.drawColor(0, PorterDuff.Mode.CLEAR) // 描画状態を保持するBitmapをクリア Initialize() // パスを描画 for (i in pathList.indices) { val pt = pathList[i] paint!!.color =colorList[i] canvas!!.drawPath(pt, paint!!) // 保存用キャンバスに描画 prevCanvas!!.drawPath(pt, paint!!) } // ロックを解除 surfaceHolder!!.unlockCanvasAndPost(canvas) // 色を指定のものに設定 paint!!.color = color } // redoメソッド fun Redo() { if (repathList.isEmpty()) { return } // redoListからパスを取り出し、Listに格納 val lastRedoPath = repathList.removeLast() pathList.add(lastRedoPath) val lastRedocolor = recolorList.removeLast() colorList.add(lastRedocolor) // ロックしてキャンバスを取得 canvas = surfaceHolder!!.lockCanvas() // キャンバスのクリア canvas!!.drawColor(0, PorterDuff.Mode.CLEAR) // パスを描画 for (i in pathList.indices) { val pt = pathList[i] paint!!.color =colorList[i] canvas!!.drawPath(pt, paint!!) // 保存用キャンバスに描画 prevCanvas!!.drawPath(pt, paint!!) } // ロックを解除 surfaceHolder!!.unlockCanvasAndPost(canvas) ///色を指定のものに設定 paint!!.color = color } // saveメソッド fun Save(){ // ディレクトリがなければ作成 if (!context.filesDir.exists()) { context.filesDir.mkdirs() } // 新しいcanvasに保存用Bitmapをセット Canvas(prevBitmap!!) // canvasに対して描画 try { //出力ファイルを準備 val fos = FileOutputStream(File(context.filesDir,GetFileName())) // PNG形式で出力 prevBitmap!!.compress(CompressFormat.PNG, 100, fos) fos.close() } catch (e: FileNotFoundException) { e.printStackTrace() } catch (e: IOException) { e.printStackTrace() } Toast.makeText( context, context.filesDir.toString()+"にセーブしました", Toast.LENGTH_LONG ).show() } // saveするファイル名を取得(saveMemo月_日_時_分.png) private fun GetFileName(): String { val c: Calendar = Calendar.getInstance() return("saveMemo" +(((c.get(Calendar.MONTH) + 1)).toString() + "_" + c.get(Calendar.DAY_OF_MONTH).toString() + "_" + c.get(Calendar.HOUR_OF_DAY).toString() + "_" + c.get(Calendar.MINUTE).toString() + ".png")) }
これで完成です こんな感じになります
(再生できなくなっていたので2024.1.26に修正しました)
ちなみにセーブしたデータは
/data/data/[package_name]/files/以下にsaveMemo月_日_時_分.pngという形で保存されます
デバイスエクスプローラーで見てみると確かに保存されています