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

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

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

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

Android

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

Q&A

解決済

1回答

1852閲覧

SurfaceViewで表示した画像に手書きしたい

hideohashimoto

総合スコア12

Java

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

Android

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

0グッド

1クリップ

投稿2018/05/03 00:46

下記の3をやりたいのですがやり方がわかりませんのでご教示お願い致します。

1.SurfaceViewで手書きして保存し、GridViewにて表示
2.GridViewにて選択した画像をSurfaceViewで表示
3.2で表示した画像に再度手書きしたい

現状は再度手書きすると表示した画像は消えますので残したまま手書きしたいです。
mDrawBitmap = mBitmap; とすると画像は消えませんが、当然手書きすると1回書いて次に書こうとすると前に書いた線は消えてしまいます。

色々やってみましたがわかりませんのでよろしくお願い致します。

java

1public class HandwriteSurfaceView extends SurfaceView implements Callback { 2 3 private SurfaceHolder mHolder; 4 private Paint mPaint; 5 private Path mPath; 6 private Bitmap mDrawBitmap; 7 private Canvas mDrawCanvas; 8 private Bitmap mBitmap = null; 9 10 public HandwriteSurfaceView(Context context) { 11 super(context); 12 init(); 13 } 14 15 public HandwriteSurfaceView(Context context, AttributeSet attrs) { 16 super(context, attrs); 17 init(); 18 } 19 20 private void init() { 21 mHolder = getHolder(); 22 setZOrderOnTop(true); 23 mHolder.setFormat(PixelFormat.TRANSPARENT); 24 mHolder.addCallback(this); 25 mPaint = new Paint(); 26 mPaint.setColor(Color.BLACK); 27 mPaint.setStyle(Paint.Style.STROKE); 28 mPaint.setStrokeCap(Paint.Cap.ROUND); 29 mPaint.setAntiAlias(true); 30 mPaint.setStrokeWidth(20); 31 } 32 33 // GridViewで選択した画像 34 public void setBitmap(Bitmap bitmap) { 35 this.mBitmap = bitmap; 36 } 37 38 @Override 39 public void surfaceCreated(SurfaceHolder holder) { 40 clearLastDrawBitmap(); 41 42 // GridViewで選択した画像を表示 43 if (mBitmap != null) { 44 Canvas canvas = mHolder.lockCanvas(); 45 canvas.drawBitmap(mBitmap, 0, 0, null); 46 mHolder.unlockCanvasAndPost(canvas); 47 } 48 } 49 50 @Override 51 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 52 } 53 54 @Override 55 public void surfaceDestroyed(SurfaceHolder holder) 56 mDrawBitmap.recycle(); 57 } 58 59 private void clearLastDrawBitmap() { 60 if (mDrawBitmap == null) { 61 mDrawBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888); 62 } 63 64 if (mDrawCanvas == null) { 65 mDrawCanvas = new Canvas(mDrawBitmap); 66 } 67 mDrawCanvas.drawColor(0xFFFFFFFF); 68 } 69 70 @Override 71 public boolean onTouchEvent(MotionEvent event) { 72 switch (event.getAction()) { 73 case MotionEvent.ACTION_DOWN: 74 onTouchDown(event.getX(), event.getY()); 75 break; 76 77 case MotionEvent.ACTION_MOVE: 78 onTouchMove(event.getX(), event.getY()); 79 break; 80 81 case MotionEvent.ACTION_UP: 82 onTouchUp(event.getX(), event.getY()); 83 break; 84 default: 85 } 86 return true; 87 } 88 89 private void onTouchDown(float x, float y) { 90 mPath = new Path(); 91 mPath.moveTo(x, y); 92 } 93 94 private void onTouchMove(float x, float y) { 95 mPath.lineTo(x, y); 96 drawLine(mPath); 97 } 98 99 private void onTouchUp(float x, float y) { 100 mPath.lineTo(x, y); 101 drawLine(mPath); 102 mDrawCanvas.drawPath(mPath, mPaint); 103 } 104 105 private void drawLine(Path path) { 106 Canvas canvas = mHolder.lockCanvas(); 107 canvas.drawColor(0, Mode.CLEAR); 108 canvas.drawBitmap(mDrawBitmap, 0, 0, null); 109 canvas.drawPath(path, mPaint); 110 mHolder.unlockCanvasAndPost(canvas); 111 } 112

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

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

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

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

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

guest

回答1

0

ベストアンサー

mBitmapをコピーしたものをmDrawBitmapとして、同じようにmDrawCanvasを生成すればよいと思います。

java

1@Override 2public void surfaceCreated(SurfaceHolder holder) { 3 prepareDrawBitmap(); 4 5 // mDrawBitmapを描画 6 Canvas canvas = mHolder.lockCanvas(); 7 canvas.drawBitmap(mDrawBitmap, 0, 0, null); 8 mHolder.unlockCanvasAndPost(canvas); 9} 10 11private void prepareDrawBitmap() { 12 if (mBitmap != null) { 13 // mBitmapがセットされていればそれを元にmDrawBitmapを生成 14 mDrawBitmap = mBitmap.copy(mBitmap.getConfig(), true); 15 mDrawCanvas = new Canvas(mDrawBitmap); 16 } else { 17 // そうでない場合は新規にmDrawBitmapを生成 18 mDrawBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888); 19 mDrawCanvas = new Canvas(mDrawBitmap); 20 mDrawCanvas.drawColor(0xFFFFFFFF); 21 } 22} 23

投稿2018/05/06 12:53

kakajika

総合スコア3131

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

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

hideohashimoto

2018/05/07 01:47

出来ました。 早々に回答していただき助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問