<疑問>
Pathには「1つの線の情報」が入っていますか?「1つ目の線~最後に描いた線の複数の情報」が入っていますか?
https://dev.classmethod.jp/smartphone/android/android-touch-drawing-undo/
上記リンクのお絵描きアプリを改造していて疑問を持ちました
Kotlinで書き換えて Path を MutableList で管理をしているのですが
ペン色変更機能を追加したところUndo機能で問題が発生しました
(コチラの動作の問題は既にクリアしています、Pathに対する疑問のみです)
「Undo動作フロー」
1.CanvasをロックしてHolderに入れる
2.HolderのCanvasをクリア
3.1つ手前まで全ての線をList内の Path,Paint で順番に描く
4.HolderのCanvasをViewに戻す
3.の過去の線を描く手順で、最後に描く線の Paint が持つ Color の情報で全ての線が置き換わってしまったようです
MutableListに入れたPathの情報が「1つ目の線~最後に描いた線の複数の情報」を持っているのなら対応した最後のPaint情報で上書きされてる?
SurfaceViewのダブルバッファリングによる問題なのか?とも考えており、、、
疑問を抱えたまま先へ進んでしまったため質問させていただきました。
一応、現在のプログラムより抜粋
kotlin
1 // 1.MutableListに置き換えた 2 private var mActionNumber : Int = 0 3 private val mUndoStack : MutableList<Path> = mutableListOf() 4 private var mRedoNumber : Int = 0 5 private val mRedoStack : MutableList<Path> = mutableListOf() 6 7 8 // 2.Paintも追加 9 private val mRedoPaint : MutableList<Paint> = mutableListOf() 10 private val mUndoPaint : MutableList<Paint> = mutableListOf() 11 12 13 // 3.色にナンバー付けてリスト管理 14 ////////////////////////////////////////////////////////// 15 private var mColorNumber :Int = 0 16 private val mUndoColor : MutableList<Int> = mutableListOf() 17 private val mRedoColor : MutableList<Int> = mutableListOf() 18 ////////////////////////////////////////////////////////// 19 20 // 2.色変ボタン追加 21 fun blackColor(){ 22 mPaint!!.color = Color.BLACK 23 mColorNumber = 0 // 3.色にナンバー付けてリスト管理 24 } 25 fun redColor(){ 26 mPaint!!.color = Color.RED 27 mColorNumber = 1 // 3.色にナンバー付けてリスト管理 28 } 29 30 31 // アンドゥがおかしい、、、 32 // SurfaceView と Path の同期が取れない???? 33 fun undo() { 34 if (mActionNumber == 0) { 35 return 36 } 37 // undoスタックからパスを取り出し、redoスタックに格納します。 38 val lastUndoPath = mUndoStack.removeAt(mActionNumber-1) 39 val lastUndoPaint = mUndoPaint.removeAt(mActionNumber-1) 40 val lastUndoColor = mUndoColor.removeAt(mActionNumber-1) 41 mActionNumber-- 42 43 mRedoStack.add(mRedoNumber,lastUndoPath) 44 mRedoPaint.add(mRedoNumber,lastUndoPaint) 45 mRedoColor.add(mRedoNumber,lastUndoColor) 46 mRedoNumber++ 47 48 // ロックしてキャンバスを取得します。 49 val canvas = mHolder!!.lockCanvas() 50 51 // 取得したキャンバスをクリアします。 52 canvas.drawColor(0, PorterDuff.Mode.CLEAR) 53 54 // 描画状態を保持するBitmapをクリアします。 55 clearLastDrawBitmap() 56 57 // パスを描画します。 58 var i:Int = 0 59 for(i in 0..mActionNumber-1) { 60 var path1 = mUndoStack.get(i) 61 var paint1 = mUndoPaint.get(i) 62 var color1 = mUndoColor.get(i) 63 64 // 3.色にナンバー付けてリスト管理 65 when(color1){ //ここで paint1 の color 情報を書き換える 66 0 -> paint1.color = Color.BLACK 67 1 -> paint1.color = Color.RED 68 } 69 canvas.drawPath(path1, paint1) 70 } 71 // ロックを外します。 72 mHolder!!.unlockCanvasAndPost(canvas) 73 }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/02 00:16
2019/12/02 00:39