🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

1285閲覧

Pathにはどのようなデータが含まれているのでしょうか?

HRSKT

総合スコア168

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/12/01 12:23

<疑問>
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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

"線" というのがちょっと曖昧な表現なので勘違いされているのかもしれません。お絵描きで書くような"線"は複数の連続する"直線"によって構成されるものなので、それを表現するためにPathが用いられます。


ご質問のコードを拝見する限りだと、問題の原因はPaintの実装にあると思います。

現状ではmUndoPaint/mRedoPaintに追加するPaintのインスタンスがすべて同じになってしまっていませんか?undo/redoなどを想定してペン色の変更機能を実装するなら、mUndoPaint/mRedoPaintに追加する時点でPaintのインスタンスを別に作るべきです。

kotlin

1mUndoPaint.add(mPaint) 2mPaint = Paint(mPaint)

投稿2019/12/02 00:01

編集2019/12/02 00:33
kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HRSKT

2019/12/02 00:16

回答ありがとうございます おっしゃる通りですね Undo/Redoの動作では別の path1/Paint1 を作って対応しています そこにMutableListに格納していた Path()/Paint() を入れていたのですが Paintのcolor情報が繁栄されず?全て同じ色になっていました 格納されたPaintには色情報がないのかな?(新たな疑問w) SV/Path/Paintの疑問内容を納得できるようなプログラムを何個か書いてテストを試みてみます ありがとうございました
kakajika

2019/12/02 00:39

MutableList等に入れてPaintの色情報が失われるなどということはありません。回答に書いたとおりPaintのインスタンスが共有されていることが問題だと思いますので、まずはPaintのインスタンスが正しいタイミングで新しく作られているかを確認してみてください。
guest

0

Path には複数の情報が保存出来たと思います. ドキュメントでご確認ください.

複数の情報が保存出来れば,

「1つの線の情報」が入っていますか?「1つ目の線~最後に描いた線の複数の情報」が入っていますか

は, 使い方次第です.

投稿2019/12/01 15:09

jimbe

総合スコア13201

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HRSKT

2019/12/01 22:11

回答ありがとうございます 使い方次第なんですね、違う動作で作って試しながら感覚つかんでいこうと思います SurfseViewのダブルバッファリングは別のスレッドで描画してるからタイミングにより結果が別なものになってたのかな??? PathもSurfaceViewも分かっておらず、、、 別なフロー試したり、develope細かく見て整理してみます ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問