日々是好日~every day is a good day~

日常の中の非日常の備忘録

【Android Studio】手書きメモアプリ 4回目

昨日からの続きです
今日は各ボタンをタップした時の処理を編集します

 // カラーチェンジメソッド
    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という形で保存されます
バイスエクスプローラーで見てみると確かに保存されています