前提
androidstudioについて質問します
お絵描きアプリを作成しています。保存機能も追加したいと思ったのですがうまくいきません。
保存内容を編集したりしたいので画像保存などではなく、データベースに保存したいと思っています。
保存するにはjson形式で文字列化にして保存すると思っていたのですが、json形式にするにはmapではないといけないらしく、うまくいかなかったです。
実現したいこと
canvasの内容を保存する
該当のソースコード
MainActivity.java
1import android.os.Bundle; 2import android.view.View; 3import android.widget.Button; 4 5import androidx.appcompat.app.AppCompatActivity; 6 7public class MainActivity extends AppCompatActivity { 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 final CanvasView cv = (CanvasView) findViewById(R.id.canvas_view); 15 16 //-- Button関連 17 Button bt = (Button) findViewById(R.id.btnClear); 18 //- 動作設定 19 bt.setOnClickListener(new View.OnClickListener() { 20 @Override 21 public void onClick(View v) { 22 cv.allDelete(); 23 } 24 }); 25 26 //-- Button関連 27 Button save = (Button) findViewById(R.id.btnSave); 28 //- 動作設定 29 save.setOnClickListener(new View.OnClickListener() { 30 @Override 31 public void onClick(View v) { 32 } 33 }); 34 } 35}
CanvasView.java
1import android.content.Context; 2import android.graphics.Canvas; 3import android.graphics.Color; 4import android.graphics.Paint; 5import android.graphics.Path; 6import android.util.AttributeSet; 7import android.view.MotionEvent; 8import android.view.View; 9 10import java.util.ArrayList; 11 12public class CanvasView extends View { 13 14 private final ArrayList<Path> pathList; // 直線リスト 15 private final Paint paint; 16 17 //====================================================================================== 18 //-- コンストラクタ 19 //====================================================================================== 20 public CanvasView(Context context, AttributeSet attrs) { 21 super(context, attrs); 22 23 //-- 初期化 24 //- Path関連 25 pathList = new ArrayList<Path>(); // リストの作成 26 27 //- Paint関連 28 paint = new Paint(); 29 paint.setColor(Color.BLACK); // 色の指定 30 paint.setStyle(Paint.Style.STROKE); // 描画設定を'線'に設定 31 paint.setAntiAlias(true); // アンチエイリアスの適応 32 paint.setStrokeWidth(10); // 線の太さ 33 } 34 35 //====================================================================================== 36 //-- 描画メソッド 37 //====================================================================================== 38 @Override 39 protected void onDraw(Canvas canvas) { 40 for ( Path path : pathList ) { 41 canvas.drawPath(path, paint); // Pathの描画 42 } 43 44 invalidate(); // 再描画 45 } 46 47 //====================================================================================== 48 //-- タッチイベント 49 //===================================================================================== 50 private Path drawingPath; 51 52 @Override 53 public boolean onTouchEvent(MotionEvent event) { 54 55 switch ( event.getAction() ) { 56 case MotionEvent.ACTION_DOWN: //- 画面をタッチしたとき 57 drawingPath = new Path(); // 新たなPathのインスタンスの作成 58 drawingPath.moveTo(event.getX(), event.getY()); // 始点を設定 59 pathList.add(drawingPath); // リストにPathを追加 60 break; 61 case MotionEvent.ACTION_UP: //- 画面から指を離したとき 62 drawingPath.moveTo(event.getX(), event.getY()); // 移動先の追加 63 break; 64 case MotionEvent.ACTION_MOVE: //- タッチしながら指をスライドさせたとき 65 drawingPath.lineTo(event.getX(), event.getY()); // 移動先の追加 66 break; 67 } 68 69 for ( Path path : pathList ) { 70 System.out.println("pathList:"+path); 71 } 72 System.out.println("drawingPath:"+drawingPath); 73 System.out.println("pathList:"+pathList); 74 return true; /* 返却値は必ず "true" にすること!! */ 75 } 76 77 //====================================================================================== 78 //-- 削除メソッド 79 //====================================================================================== 80 public void allDelete() { 81 pathList.clear(); // リストが保持しているPathのインスタンスを全て削除 82 } 83}
activity_main.xml
1<!-- LinearLayoutをRelativeLayoutに変更 --> 2<!-- android:orientation="vertical"を追加 --> 3<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:id="@+id/activity_main" 7 8 android:layout_width="match_parent" 9 10 android:layout_height="match_parent" 11 android:orientation="vertical" 12 tools:context=".MainActivity"> 13 14 15 <!-- 追加:ここから --> 16 <!-- キャンバス --> 17 <!-- パッケージ名を含むクラス名で指定 --> 18 <patsample.CanvasView 19 android:id="@+id/canvas_view" 20 android:layout_width="match_parent" 21 android:layout_height="0dp" 22 android:layout_marginStart="8dp" 23 android:layout_marginTop="8dp" 24 android:layout_marginEnd="8dp" 25 android:layout_marginBottom="8dp" 26 app:layout_constraintBottom_toTopOf="@+id/btnClear" 27 app:layout_constraintEnd_toEndOf="parent" 28 app:layout_constraintStart_toStartOf="parent" 29 app:layout_constraintTop_toTopOf="parent" /> 30 31 <!-- キャンバスクリア用ボタン --> 32 <Button 33 android:id="@+id/btnClear" 34 android:layout_width="0dp" 35 android:layout_height="wrap_content" 36 android:layout_alignBottom="@id/canvas_view" 37 android:layout_marginStart="8dp" 38 android:layout_marginEnd="8dp" 39 android:layout_marginBottom="8dp" 40 android:text="@string/btnClear" 41 app:layout_constraintBottom_toBottomOf="parent" 42 app:layout_constraintEnd_toStartOf="@+id/guideline38" 43 app:layout_constraintStart_toStartOf="parent" /> 44 45 <androidx.constraintlayout.widget.Guideline 46 android:id="@+id/guideline38" 47 android:layout_width="wrap_content" 48 android:layout_height="wrap_content" 49 android:orientation="vertical" 50 app:layout_constraintGuide_percent="0.5" /> 51 52 <Button 53 android:id="@+id/btnSave" 54 android:layout_width="0dp" 55 android:layout_height="wrap_content" 56 android:layout_marginStart="8dp" 57 android:layout_marginTop="8dp" 58 android:layout_marginEnd="8dp" 59 android:layout_marginBottom="8dp" 60 android:text="保存" 61 app:layout_constraintBottom_toBottomOf="parent" 62 app:layout_constraintEnd_toEndOf="parent" 63 app:layout_constraintStart_toStartOf="@+id/guideline38" 64 app:layout_constraintTop_toBottomOf="@+id/canvas_view" /> 65 <!-- 追加:ここまで --> 66 67</androidx.constraintlayout.widget.ConstraintLayout>
あなたの回答
tips
プレビュー