質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

1回答

3131閲覧

Android Studio 開発 Canvas上に描いた絵を保存できるようにしたい

tokutoku453

総合スコア13

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2019/02/13 05:55

編集2022/01/12 10:55

お絵かきソフトを開発しています
キャンバス上に絵を描くことができるようになっていますが、こちらをセーブボタンを作り、セーブボタンをタップした際にandroid本体のアルバムに保存できるような処理を実装したいです
2月14日追記
こちらアンサーの追記などを元にコードを編集しなおしましたが、bitmap保存には至りませんでした。

MainActivity

1import android.app.Activity; 2import android.graphics.Color; 3import android.os.Bundle; 4import android.os.CpuUsageInfo; 5import android.support.v7.app.AppCompatActivity; 6import android.view.View; 7import android.view.Window; 8import android.widget.Button; 9import android.widget.CompoundButton; 10import android.widget.Toast; 11import android.widget.ImageButton; 12 13 14 15public class MainActivity extends AppCompatActivity implements View.OnClickListener { 16 private DrawingView drawingView; 17 ImageButton red_button,blue_button,yellow_button,black_button,kesigomu_button,cyan_button,gray_button,green_button; 18 ImageButton orange_button,pink_button,purple_button,kimidori_button,mizuiro_button,hadairo_button; 19 Button hutosa1_button,hutosa2_button,kukei_button; 20 21 22 23 24 @Override 25 protected void onCreate(Bundle savedInstanceState) { 26 super.onCreate(savedInstanceState); 27 supportRequestWindowFeature(Window.FEATURE_NO_TITLE); 28 setContentView(R.layout.activity_main); 29 30 31//線の色指定 32 blue_button= findViewById(R.id.blue_button); 33 red_button= findViewById(R.id.red_button); 34 yellow_button= findViewById(R.id.yellow_button) ; 35 black_button= findViewById(R.id.black_button); 36 kesigomu_button= findViewById(R.id.kesigomu_button); 37 cyan_button= findViewById(R.id.cyan_button); 38 gray_button= findViewById(R.id.gray_button); 39 green_button= findViewById(R.id.green_button); 40 orange_button= findViewById(R.id.orange_button); 41 pink_button= findViewById(R.id.pink_button); 42 purple_button= findViewById(R.id.purple_button); 43 kimidori_button= findViewById(R.id.kimidori_button); 44 mizuiro_button= findViewById(R.id.mizuiro_button); 45 hadairo_button= findViewById(R.id.hadairo_button); 46 47 48 //線の太さ指定 49 hutosa1_button= findViewById(R.id.hutosa1_button); 50 hutosa2_button= findViewById(R.id.hutosa2_button); 51 //矩形処理 52 kukei_button= findViewById(R.id.kukei_button); 53 54 55 blue_button.setOnClickListener(this); 56 red_button.setOnClickListener(this); 57 yellow_button.setOnClickListener(this); 58 black_button.setOnClickListener(this); 59 kesigomu_button.setOnClickListener(this); 60 cyan_button.setOnClickListener(this); 61 gray_button.setOnClickListener(this); 62 green_button.setOnClickListener(this); 63 orange_button.setOnClickListener(this); 64 pink_button.setOnClickListener(this); 65 purple_button.setOnClickListener(this); 66 kimidori_button.setOnClickListener(this); 67 mizuiro_button.setOnClickListener(this); 68 hadairo_button.setOnClickListener(this); 69 70 hutosa1_button.setOnClickListener(this); 71 hutosa2_button.setOnClickListener(this); 72 kukei_button.setOnClickListener(this); 73 74 75 76 77 78 this.drawingView = findViewById(R.id.drawing_view); 79 80 findViewById(R.id.deletebutton).setOnClickListener(deleteDrawing); 81 82 } 83 View.OnClickListener deleteDrawing = new View.OnClickListener(){ 84 @Override 85 public void onClick(View view){ 86 drawingView.delete(); 87 } 88 }; 89 90 91 public void onClick(View v){ 92 switch(v.getId()){ 93 //線の色指定 94 case R.id.blue_button: 95 drawingView.setPen(Color.BLUE); 96 Toast.makeText(this,"blue",Toast.LENGTH_SHORT).show(); 97 break; 98 case R.id.red_button: 99 drawingView.setPen(Color.RED); 100 Toast.makeText(this,"red",Toast.LENGTH_SHORT).show(); 101 break; 102 case R.id.yellow_button: 103 drawingView.setPen(Color.YELLOW); 104 Toast.makeText(this,"yellow",Toast.LENGTH_SHORT).show(); 105 break; 106 case R.id.black_button: 107 drawingView.setPen(Color.BLACK); 108 Toast.makeText(this,"black",Toast.LENGTH_SHORT).show(); 109 break; 110 case R.id.kesigomu_button: 111 drawingView.setPen(Color.WHITE); 112 drawingView.setStrokeWidth(40); 113 Toast.makeText(this,"消しゴム",Toast.LENGTH_SHORT).show(); 114 break; 115 case R.id.cyan_button: 116 drawingView.setPen(Color.CYAN); 117 Toast.makeText(this,"Cyan",Toast.LENGTH_SHORT).show(); 118 break; 119 case R.id.gray_button: 120 drawingView.setPen(Color.GRAY); 121 Toast.makeText(this,"gray",Toast.LENGTH_SHORT).show(); 122 break; 123 case R.id.green_button: 124 drawingView.setPen(Color.GREEN); 125 Toast.makeText(this,"green",Toast.LENGTH_SHORT).show(); 126 break; 127 case R.id.orange_button: 128 drawingView.setPen(Color.rgb(255,165,0)); 129 Toast.makeText(this,"orange",Toast.LENGTH_SHORT).show(); 130 break; 131 case R.id.pink_button: 132 drawingView.setPen(Color.rgb(255,192,187)); 133 Toast.makeText(this,"pink",Toast.LENGTH_SHORT).show(); 134 break; 135 case R.id.purple_button: 136 drawingView.setPen(Color.rgb(128,0,128)); 137 Toast.makeText(this,"purple",Toast.LENGTH_SHORT).show(); 138 break; 139 case R.id.kimidori_button: 140 drawingView.setPen(Color.rgb(85,107,47)); 141 Toast.makeText(this,"darkgreen",Toast.LENGTH_SHORT).show(); 142 break; 143 case R.id.mizuiro_button: 144 drawingView.setPen(Color.GREEN); 145 Toast.makeText(this,"green",Toast.LENGTH_SHORT).show(); 146 break; 147 case R.id.hadairo_button: 148 drawingView.setPen(Color.rgb(245,208,169)); 149 Toast.makeText(this,"hadairo",Toast.LENGTH_SHORT).show(); 150 break; 151 152 //線の太さ指定 153 case R.id.hutosa1_button: 154 drawingView.setStrokeWidth(40); 155 Toast.makeText(this,"ペン先 1×1",Toast.LENGTH_SHORT).show(); 156 break; 157 case R.id.hutosa2_button: 158 drawingView.setStrokeWidth(120); 159 Toast.makeText(this,"ペン先 3×3",Toast.LENGTH_SHORT).show(); 160 break; 161 case R.id.kukei_button: 162 drawingView.setStrokeWidth(200); 163 Toast.makeText(this,"矩形",Toast.LENGTH_SHORT).show(); 164 165 } 166 } 167 168 @Override 169 public void onPointerCaptureChanged(boolean hasCapture) { 170 171 } 172 173} 174

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

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

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

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

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

guest

回答1

0

参考リンクだけですが取り急ぎ。
ここに完全に動くサンプルが載ってます。
お絵かきプログラムとツギハギすれば実装できると思います。
https://acomputerengineer.wordpress.com/2015/01/13/how-to-draw-canvas-on-imageview-and-save-canvas-as-bitmap-and-store-in-sdcard-in-android/
保存の処理は以下の部分に書いてあります

#2 Save canvas bitmap to sdcard.

We will save this bitmap to sdcard so all your drawing on canvas will be stored as image.

こっちはフルで動くサンプルではないですがstackoverflowなので載せときます
stackoverflow

投稿2019/02/13 09:50

編集2019/02/13 13:48
bochan2

総合スコア2050

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

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

tokutoku453

2019/02/13 11:06

こちら 色々試してみましたがうまくいきません コード記述ます import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import java.io.File; import java.io.FileOutputStream; public class SendScreenShotActivity extends Activity implements OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 全体キャプチャ Button captureAll = findViewById(R.id.capture_all); captureAll.setOnClickListener(this); } @Override public void onClick(View v) { // 読み書きするファイル名を指定 File file = new File(Environment.getExternalStorageDirectory() + "/capture.jpeg"); // 指定したファイル名が無ければ作成する。 file.getParentFile().mkdir(); switch(v.getId()) { case R.id.capture_all: // 全体を撮る saveCapture(findViewById(android.R.id.content),file); break; } } /** * 撮ったキャプチャを保存 * @param view * @param 書き込み先ファイルfile */ public void saveCapture(View view, File file) { // キャプチャを撮る Bitmap capture = getViewCapture(view); FileOutputStream fos = null; try { fos = new FileOutputStream(file, false); // 画像のフォーマットと画質と出力先を指定して保存 capture.compress(CompressFormat.JPEG, 100, fos); fos.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException ie) { fos = null; } } } } /** * キャプチャを撮る * @param 撮りたいview * @return 撮ったキャプチャ(Bitmap) */ public Bitmap getViewCapture(View view) { view.setDrawingCacheEnabled(true); // Viewのキャプチャを取得 Bitmap cache = view.getDrawingCache(); if(cache == null){ return null; } Bitmap screenShot = Bitmap.createBitmap(cache); view.setDrawingCacheEnabled(false); return screenShot; } }
bochan2

2019/02/13 13:44

一番上のサイトの追記した引用部分を試してみてはどうでしょうか?
tokutoku453

2019/02/13 17:55 編集

こちら一番上のサイトの引用部分を追記したのですがうまくいきません。
tokutoku453

2019/02/13 18:56

こちら 色々と試したのですがうまくいかなかったので質問を編集します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問