Android Studio 開発 Canvas上に描いた絵を保存できるようにしたい
- 評価
- クリップ 0
- VIEW 51
お絵かきソフトを開発しています
キャンバス上に絵を描くことができるようになっていますが、こちらをセーブボタンを作り、セーブボタンをタップした際にandroid本体のアルバムに保存できるような処理を実装したいです
2月14日追記
こちらアンサーの追記などを元にコードを編集しなおしましたが、bitmap保存には至りませんでした。
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.CpuUsageInfo;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Toast;
import android.widget.ImageButton;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private DrawingView drawingView;
ImageButton red_button,blue_button,yellow_button,black_button,kesigomu_button,cyan_button,gray_button,green_button;
ImageButton orange_button,pink_button,purple_button,kimidori_button,mizuiro_button,hadairo_button;
Button hutosa1_button,hutosa2_button,kukei_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//線の色指定
blue_button= findViewById(R.id.blue_button);
red_button= findViewById(R.id.red_button);
yellow_button= findViewById(R.id.yellow_button) ;
black_button= findViewById(R.id.black_button);
kesigomu_button= findViewById(R.id.kesigomu_button);
cyan_button= findViewById(R.id.cyan_button);
gray_button= findViewById(R.id.gray_button);
green_button= findViewById(R.id.green_button);
orange_button= findViewById(R.id.orange_button);
pink_button= findViewById(R.id.pink_button);
purple_button= findViewById(R.id.purple_button);
kimidori_button= findViewById(R.id.kimidori_button);
mizuiro_button= findViewById(R.id.mizuiro_button);
hadairo_button= findViewById(R.id.hadairo_button);
//線の太さ指定
hutosa1_button= findViewById(R.id.hutosa1_button);
hutosa2_button= findViewById(R.id.hutosa2_button);
//矩形処理
kukei_button= findViewById(R.id.kukei_button);
blue_button.setOnClickListener(this);
red_button.setOnClickListener(this);
yellow_button.setOnClickListener(this);
black_button.setOnClickListener(this);
kesigomu_button.setOnClickListener(this);
cyan_button.setOnClickListener(this);
gray_button.setOnClickListener(this);
green_button.setOnClickListener(this);
orange_button.setOnClickListener(this);
pink_button.setOnClickListener(this);
purple_button.setOnClickListener(this);
kimidori_button.setOnClickListener(this);
mizuiro_button.setOnClickListener(this);
hadairo_button.setOnClickListener(this);
hutosa1_button.setOnClickListener(this);
hutosa2_button.setOnClickListener(this);
kukei_button.setOnClickListener(this);
this.drawingView = findViewById(R.id.drawing_view);
findViewById(R.id.deletebutton).setOnClickListener(deleteDrawing);
}
View.OnClickListener deleteDrawing = new View.OnClickListener(){
@Override
public void onClick(View view){
drawingView.delete();
}
};
public void onClick(View v){
switch(v.getId()){
//線の色指定
case R.id.blue_button:
drawingView.setPen(Color.BLUE);
Toast.makeText(this,"blue",Toast.LENGTH_SHORT).show();
break;
case R.id.red_button:
drawingView.setPen(Color.RED);
Toast.makeText(this,"red",Toast.LENGTH_SHORT).show();
break;
case R.id.yellow_button:
drawingView.setPen(Color.YELLOW);
Toast.makeText(this,"yellow",Toast.LENGTH_SHORT).show();
break;
case R.id.black_button:
drawingView.setPen(Color.BLACK);
Toast.makeText(this,"black",Toast.LENGTH_SHORT).show();
break;
case R.id.kesigomu_button:
drawingView.setPen(Color.WHITE);
drawingView.setStrokeWidth(40);
Toast.makeText(this,"消しゴム",Toast.LENGTH_SHORT).show();
break;
case R.id.cyan_button:
drawingView.setPen(Color.CYAN);
Toast.makeText(this,"Cyan",Toast.LENGTH_SHORT).show();
break;
case R.id.gray_button:
drawingView.setPen(Color.GRAY);
Toast.makeText(this,"gray",Toast.LENGTH_SHORT).show();
break;
case R.id.green_button:
drawingView.setPen(Color.GREEN);
Toast.makeText(this,"green",Toast.LENGTH_SHORT).show();
break;
case R.id.orange_button:
drawingView.setPen(Color.rgb(255,165,0));
Toast.makeText(this,"orange",Toast.LENGTH_SHORT).show();
break;
case R.id.pink_button:
drawingView.setPen(Color.rgb(255,192,187));
Toast.makeText(this,"pink",Toast.LENGTH_SHORT).show();
break;
case R.id.purple_button:
drawingView.setPen(Color.rgb(128,0,128));
Toast.makeText(this,"purple",Toast.LENGTH_SHORT).show();
break;
case R.id.kimidori_button:
drawingView.setPen(Color.rgb(85,107,47));
Toast.makeText(this,"darkgreen",Toast.LENGTH_SHORT).show();
break;
case R.id.mizuiro_button:
drawingView.setPen(Color.GREEN);
Toast.makeText(this,"green",Toast.LENGTH_SHORT).show();
break;
case R.id.hadairo_button:
drawingView.setPen(Color.rgb(245,208,169));
Toast.makeText(this,"hadairo",Toast.LENGTH_SHORT).show();
break;
//線の太さ指定
case R.id.hutosa1_button:
drawingView.setStrokeWidth(40);
Toast.makeText(this,"ペン先 1×1",Toast.LENGTH_SHORT).show();
break;
case R.id.hutosa2_button:
drawingView.setStrokeWidth(120);
Toast.makeText(this,"ペン先 3×3",Toast.LENGTH_SHORT).show();
break;
case R.id.kukei_button:
drawingView.setStrokeWidth(200);
Toast.makeText(this,"矩形",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/02/13 20: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;
}
}
2019/02/13 22:44
2019/02/14 02:55 編集
2019/02/14 03:56