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

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

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

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

Android Studio

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

Q&A

1回答

5064閲覧

AndroidStudioでのお絵かきアプリの色変更等

shamoji

総合スコア6

Java

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

Android Studio

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

0グッド

0クリップ

投稿2018/05/23 00:49

編集2022/01/12 10:55

AndroidStudioで簡単なお絵かきアプリを作っています。
色々調べながらタッチした部分に線を描画することはできたのですが
ボタンを押して保存や色変更がうまくいきません

MainActivity内のonClick内でmyViewのメソッドを使い変更しようとしています

MainActivity

java

1import android.graphics.Color; 2import android.provider.MediaStore; 3import android.support.v7.app.AppCompatActivity; 4import android.os.Bundle; 5import android.view.View; 6import android.widget.Button; 7import android.widget.Toast; 8 9public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 10 11 MyView myView; 12 Button saveButton ,blueButton,redButton; 13 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 20 myView= new MyView(getApplication()); 21 saveButton =(Button)findViewById(R.id.saveButton); 22 blueButton=(Button)findViewById(R.id.blueButton); 23 redButton=(Button)findViewById(R.id.redButton); 24 saveButton.setOnClickListener(this); 25 blueButton.setOnClickListener(this); 26 redButton.setOnClickListener(this); 27 28 } 29 30 public void onClick(View v){ 31 switch(v.getId()){ 32 case R.id.saveButton: 33 myView.saveToFile(); 34 Toast.makeText(this,"saved",Toast.LENGTH_SHORT).show(); 35 break; 36 case R.id.blueButton: 37 myView.setPen(Color.BLUE); 38 Toast.makeText(this,"blue",Toast.LENGTH_SHORT).show(); 39 break; 40 case R.id.redButton: 41 myView.setPen(Color.RED); 42 Toast.makeText(this,"red",Toast.LENGTH_SHORT).show(); 43 break; 44 } 45 } 46 47} 48

描画関連のクラス

java

1import android.content.Context; 2import android.graphics.Bitmap; 3import android.graphics.Canvas; 4import android.graphics.Color; 5import android.graphics.Paint; 6import android.graphics.Rect; 7import android.os.Environment; 8import android.util.AttributeSet; 9import android.view.MotionEvent; 10import android.view.View; 11 12import java.io.File; 13import java.io.FileOutputStream; 14import java.util.ArrayList; 15import java.util.Date; 16 17public class MyView extends View { 18 19 Bitmap bmp = null; 20 Paint pen =new Paint(); 21 22 // イベント発生時のX 座標、Y 座標を保存するための動的配列 23 private ArrayList array_x, array_y; 24 private ArrayList array_status; 25 26 // コンストラクタ 27 public MyView(Context context) { 28 super(context); 29 array_x = new ArrayList(); 30 array_y = new ArrayList(); 31 array_status = new ArrayList(); 32 } 33 public MyView(Context context, AttributeSet attrs){ 34 super(context,attrs); 35 array_x = new ArrayList(); 36 array_y = new ArrayList(); 37 array_status = new ArrayList(); 38 } 39 40 // タッチパネルを操作した時に呼ばれるメソッド 41 @Override 42 public boolean onTouchEvent(MotionEvent event) { 43 //return super.onTouchEvent(event); 44 // 座標を取得 45 int x = (int) event.getX(); 46 int y = (int) event.getY(); 47 // イベントに応じて動作を変更 48 switch (event.getAction()) { 49 case MotionEvent.ACTION_DOWN: // タッチパネルが押されたとき 50 case MotionEvent.ACTION_POINTER_DOWN: 51 array_x.add(new Integer(x)); // 座標を配列に保存 52 array_y.add(new Integer(y)); // 線の描画はしない(false) 53 array_status.add(new Boolean(false)); 54 invalidate(); // 画面を強制的に再描画 55 break; 56 case MotionEvent.ACTION_MOVE: 57 array_x.add(new Integer(x)); // 座標を配列に保存 58 array_y.add(new Integer(y)); // 線の描画をする(true) 59 array_status.add(new Boolean(true)); 60 invalidate(); // 画面を強制的に再描画 61 break; 62 case MotionEvent.ACTION_UP: // タッチパネルから離れたとき 63 case MotionEvent.ACTION_POINTER_UP: 64 array_x.add(new Integer(x)); // 座標を配列に保存 65 array_y.add(new Integer(y)); // 線の描画をする(true) 66 array_status.add(new Boolean(true)); 67 invalidate(); // 画面を強制的に再描画 68 break; 69 } 70 return true; 71 } 72 73 // ビューの描画を行うときに呼ばれるメソッド 74 @Override 75 protected void onDraw(Canvas canvas) { 76 super.onDraw(canvas); 77 // 背景を白色で塗りつぶす 78 Paint p = new Paint(); 79 p.setStyle(Paint.Style.FILL); 80 p.setColor(Color.WHITE); 81 canvas.drawRect(new Rect(0, 0, 82 canvas.getWidth(), canvas.getHeight()), p); 83 // 描画用のPaint オブジェクトを用意 84 85 //p = new Paint(); 86 pen.setStyle(Paint.Style.STROKE); 87 //pen.setColor(Color.BLUE); 88 pen.setStrokeWidth(2); 89 // 配列内の座標を読み出して線(軌跡)を描画 90 for (int i = 1; i < array_status.size(); i++) { 91 // 描画するように(true)状態値が与えられているとき 92 // 一度離してしてから次に押されるまでの移動分は描画しない 93 if ((Boolean) array_status.get(i)) { 94 // 開始点の終了点の座標の値を取得 95 int x1 = (Integer) array_x.get(i - 1); 96 int x2 = (Integer) array_x.get(i); 97 int y1 = (Integer) array_y.get(i - 1); 98 int y2 = (Integer) array_y.get(i); 99 // 線を描画 100 canvas.drawLine(x1, y1, x2, y2, pen); 101 } 102 } 103 } 104 105 //画像の保存メソッド 106 public void saveToFile(){ 107 //保存先の決定 108 String status = Environment.getExternalStorageState(); 109 File fout; 110 if(!status.equals(Environment.MEDIA_MOUNTED)){ 111 fout =Environment.getDataDirectory(); 112 } 113 //ファイルがなければ新しく作る 114 else{ 115 fout = new File("/DrawingApp"); 116 fout.mkdirs(); 117 } 118 //名前に年月日をつける 119 Date d = new Date(); 120 String fname = fout.getAbsolutePath() + "/"; 121 fname += String.format("%4d%02d%02d.png",(1900+d.getYear()),d.getMonth(),d.getDate()); 122 //画像をファイルに書き込む 123 try{ 124 FileOutputStream out = new FileOutputStream(fname); 125 bmp.compress(Bitmap.CompressFormat.PNG,100,out); 126 out.flush(); 127 out.close(); 128 } 129 catch(Exception e){ } 130 131 } 132 133 public void setPen(int color){ 134 pen.setColor(color); 135 } 136 137} 138

xml ■■■■■■■■の部分だけ隠してます

xml

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <■■■■■■■■■■■■.MyView 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" /> 12 13 <Button 14 android:id="@+id/saveButton" 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" 17 android:layout_marginBottom="8dp" 18 android:layout_marginEnd="296dp" 19 android:layout_marginRight="296dp" 20 android:text="Save" 21 app:layout_constraintBottom_toBottomOf="parent" 22 app:layout_constraintEnd_toEndOf="parent" 23 app:layout_constraintHorizontal_bias="1.0" 24 app:layout_constraintStart_toStartOf="parent" /> 25 26 <Button 27 android:id="@+id/blueButton" 28 android:layout_width="wrap_content" 29 android:layout_height="wrap_content" 30 android:layout_marginLeft="8dp" 31 android:layout_marginStart="8dp" 32 android:text="Blue" 33 app:layout_constraintStart_toEndOf="@+id/redButton" 34 tools:layout_editor_absoluteY="0dp" /> 35 36 <Button 37 android:id="@+id/redButton" 38 android:layout_width="wrap_content" 39 android:layout_height="wrap_content" 40 android:layout_marginLeft="20dp" 41 android:layout_marginStart="20dp" 42 android:text="Red" 43 /> 44 45 46</android.support.constraint.ConstraintLayout>

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

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

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

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

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

guest

回答1

0

画像が保存されない件についてです。
ソースを拝見したところ、bmp の変数がnullのままの様に見えます。
Viewなどを保存する場合

View view = findViewById(R.id.view);
view.setDrawingCacheEnabled(true);
view.destroyDrawingCache();
Bitmap bmp = view.getDrawingCache();

この様にするとBitmapを取得できるかと思います。

投稿2018/05/23 11:22

kyon2

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問