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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

1回答

6100閲覧

SurfaceViewを保存、表示したい

KanPiko

総合スコア15

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/04/01 16:15

###前提・実現したいこと
Android studioでSurfaceViewを保存、表示を行いたいのですがどのようにプログラムしたらいいのかわかりません。
###該当のソースコード
SurfaceView を継承して絵を描画するクラス です。

java

1public class DrawSurfaceView extends SurfaceView implements Callback{ 2 3 private SurfaceHolder mHolder; 4 private Paint mPaint; 5 private Path mPath; 6 private Bitmap mLastDrawBitmap; 7 private Canvas mLastDrawCanvas; 8 private Deque<Path> mUndoStack = new ArrayDeque<Path>(); 9 private Deque<Path> mRedoStack = new ArrayDeque<Path>(); 10 11 SharedPreferences pref; 12 public DrawSurfaceView(Context context) { 13 super(context); 14 init(); 15 } 16 public DrawSurfaceView(Context context, AttributeSet attrs) { 17 super(context, attrs); 18 init(); 19 } 20 21 private void init() { 22 mHolder = getHolder(); 23 setZOrderOnTop(true); 24 mHolder.setFormat(PixelFormat.TRANSPARENT); 25 mHolder.addCallback(this); 26 // ペイントを設定 27 mPaint = new Paint(); 28 mPaint.setColor(Color.BLACK); 29 mPaint.setStyle(Paint.Style.STROKE); 30 mPaint.setStrokeCap(Paint.Cap.ROUND); 31 mPaint.setAntiAlias(true); 32 mPaint.setStrokeWidth(20); 33 } 34 35 @Override 36 public void surfaceCreated(SurfaceHolder holder) { 37 clearLastDrawBitmap(); 38 } 39 40 @Override 41 public void surfaceChanged(SurfaceHolder holder, int format, int width, 42 int height) { 43 } 44 @Override 45 public void surfaceDestroyed(SurfaceHolder holder) { 46 mLastDrawBitmap.recycle(); 47 } 48 private void clearLastDrawBitmap() { 49 if (mLastDrawBitmap == null) { 50 mLastDrawBitmap = Bitmap.createBitmap(getWidth(), getHeight(), 51 Config.ARGB_8888); 52 } 53 if (mLastDrawCanvas == null) { 54 mLastDrawCanvas = new Canvas(mLastDrawBitmap); 55 } 56 mLastDrawCanvas.drawColor(0, Mode.CLEAR); 57 } 58 @Override 59 public boolean onTouchEvent(MotionEvent event) { 60 switch (event.getAction()) { 61 case MotionEvent.ACTION_DOWN: 62 onTouchDown(event.getX(), event.getY()); 63 break; 64 case MotionEvent.ACTION_MOVE: 65 onTouchMove(event.getX(), event.getY()); 66 break; 67 case MotionEvent.ACTION_UP: 68 onTouchUp(event.getX(), event.getY()); 69 break; 70 default: 71 } 72 return true; 73 } 74 75 private void onTouchDown(float x, float y) { 76 mPath = new Path(); 77 mPath.moveTo(x, y); 78 } 79 80 private void onTouchMove(float x, float y) { 81 mPath.lineTo(x, y); 82 drawLine(mPath); 83 } 84 85 private void onTouchUp(float x, float y) { 86 mPath.lineTo(x, y); 87 drawLine(mPath); 88 mLastDrawCanvas.drawPath(mPath, mPaint); 89 mUndoStack.addLast(mPath); 90 mRedoStack.clear(); 91 } 92 93 private void drawLine(Path path) { 94 // ロックしてキャンバスを取得 95 Canvas canvas = mHolder.lockCanvas(); 96 // キャンバスをクリア 97 canvas.drawColor(0, Mode.CLEAR); 98 // 前回描画したビットマップをキャンバスに描画 99 canvas.drawBitmap(mLastDrawBitmap, 0, 0, null); 100 // パスを描画 101 canvas.drawPath(path, mPaint); 102 103 mHolder.unlockCanvasAndPost(canvas); 104 105 } 106 public void reset() {//リセット 107 mUndoStack.clear(); 108 mRedoStack.clear(); 109 clearLastDrawBitmap(); 110 Canvas canvas = mHolder.lockCanvas(); 111 canvas.drawColor(0, Mode.CLEAR); 112 mHolder.unlockCanvasAndPost(canvas); 113 } 114}

以下のプログラムのSurfaceView1を保存したいです。

java

1public class Problem1Activity extends FragmentActivity implements OnClickListener { 2 private DrawSurfaceView SurfaceView1; 3 private Button reset1; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_problem1); 9 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 10 11 12 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 13 fab.setOnClickListener(new View.OnClickListener() { 14 @Override 15 public void onClick(View view) { 16 Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 17 .setAction("Action", null).show(); 18 } 19 }); 20 SurfaceView1 =(DrawSurfaceView) findViewById(R.id.surfaceView1); 21 22 reset1=(Button)findViewById(R.id.reset1); 23 reset1.setOnClickListener(this); 24 } 25 @Override 26 public void onClick(View v){ 27 if(v==reset1){ 28 SurfaceView1.reset(); 29 } 30 } 31 public void buttonClick1(View view){ 32 SurfaceView1.setDrawingCacheEnabled(true);// 33 Intent intent = new Intent(this,Problem1_g_Activity.class); 34 startActivity(intent); 35 } 36 37}

保存したSurfaceView1をここに表示したいです。

java

1public class Problem1_s_Activity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_problem1_s_); 7 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 8 setSupportActionBar(toolbar); 9 10 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 11 fab.setOnClickListener(new View.OnClickListener() { 12 @Override 13 public void onClick(View view) { 14 Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 15 .setAction("Action", null).show(); 16 } 17 }); 18 } 19 public void onReturn1(View view){ 20 Intent intent= new Intent(this,Main2Activity.class); 21 startActivity(intent); 22 } 23 24}

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

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

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

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

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

swordone

2017/04/02 00:10

SurfaceViewを「保存」というのが意味がわかりません。
uniko

2017/04/02 00:16

もしかしてアプリ内(SurfaceView)のスクリーンショットが撮りたいみたいな事ですか?
KanPiko

2017/04/02 02:46

今、SurfaceViewで絵を描画できる状態なので、最後に描画したものを別のActivityで表示させたいんです。スクリーンショットでも表示できるのであれば教えてほしいです。
guest

回答1

0

ベストアンサー

SurfaceViewからBitmapに落としてやればどうですか?

Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),view.getHeight(),Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas);

どうやらSurfaceViewだとキャプチャーできないようですね。
上の回答は無視してください。申し訳ないです。

ただ今回でいうとDrawSurfaceView内でmLastDrawBitmapが描画を持っている様なのでそちらを使えばいけるかと思います。なお、一応TextureViewというのもあるのですがそちらだとgetBitmapで取れるので要件によってはこちらもありかもです。

投稿2017/04/02 03:08

編集2017/04/02 08:18
uniko

総合スコア448

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

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

KanPiko

2017/04/02 04:37

回答ありがとうございます。何度もすみませんが、もう少し詳しく説明していただけませんでしょうか?
uniko

2017/04/02 04:58

イメージでよいようなので、SurfaceViewの表示内容をBitmapに描画してあげればという事です。 コードについては、 createBitmapする際に幅などのサイズはSurfaceViewから取得して、canvasにはSurfaceViewの内容をそのままdrowしているだけです。 SurfaceViewはviewを継承してますのでいけたと思いますがダメならすいません。
KanPiko

2017/04/02 06:08

コードについてなんですが、canvasでSurafaceViewの内容をdrawするときに別画面で表示させたいのですがわかりません。
KanPiko

2017/04/02 06:20

コードについてなんですが、保存したいほうに以下の文を挿入し、 view1.setDrawingCacheEnabled(true); // キャッシュを取得する設定にする view1.destroyDrawingCache(); // 既存のキャッシュをクリアする Bitmap bmp = view1.getDrawingCache(); // キャッシュを作成して取得する 表示したいほうにこの文を挿入したのですがうまくいきませんでした。 Bitmap bmp = Bitmap.createBitmap(view1.getWidth(), view1.getHeight(), Bitmap.Config.ARGB_8888); // view のサイズで Bitmap を作成 Canvas canvas = new Canvas(bmp); // bmp をターゲットにした Canvas を作成 view1.draw(canvas); SurfaceViewではうまくいかなったので、Viewで行ってみました。
uniko

2017/04/02 08:16

一応回答を編集しました。別画面に関しては遷移先にstartActivityするIntentに入れたりやファイルに一回落とすなりやり方は色々あるかと思います。サイト内の質問にもあるやもしれませんので参照してみてくださいませ。
KanPiko

2017/04/02 09:10

詳しく説明していただきありがとうございました。 TextureViewも一度使ってみたりしていろいろ試してみたいと思います。
uniko

2017/04/02 09:18

いえ、こちらこそあまり力になれず申し訳ないです。調べたところSurfaceViewの場合はdrow時の処理を一時的に別のcanvasに変えたりして対応していたりなど何かしら工夫してるようです。一応記載しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問