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

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

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

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

Android Studio

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

受付中

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

shamoji
shamoji

総合スコア6

Java

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

Android Studio

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

1回答

0評価

0クリップ

4210閲覧

投稿2018/05/23 00:49

編集2022/01/12 10:55

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

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

MainActivity

java

import android.graphics.Color; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ MyView myView; Button saveButton ,blueButton,redButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myView= new MyView(getApplication()); saveButton =(Button)findViewById(R.id.saveButton); blueButton=(Button)findViewById(R.id.blueButton); redButton=(Button)findViewById(R.id.redButton); saveButton.setOnClickListener(this); blueButton.setOnClickListener(this); redButton.setOnClickListener(this); } public void onClick(View v){ switch(v.getId()){ case R.id.saveButton: myView.saveToFile(); Toast.makeText(this,"saved",Toast.LENGTH_SHORT).show(); break; case R.id.blueButton: myView.setPen(Color.BLUE); Toast.makeText(this,"blue",Toast.LENGTH_SHORT).show(); break; case R.id.redButton: myView.setPen(Color.RED); Toast.makeText(this,"red",Toast.LENGTH_SHORT).show(); break; } } }

描画関連のクラス

java

import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.os.Environment; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Date; public class MyView extends View { Bitmap bmp = null; Paint pen =new Paint(); // イベント発生時のX 座標、Y 座標を保存するための動的配列 private ArrayList array_x, array_y; private ArrayList array_status; // コンストラクタ public MyView(Context context) { super(context); array_x = new ArrayList(); array_y = new ArrayList(); array_status = new ArrayList(); } public MyView(Context context, AttributeSet attrs){ super(context,attrs); array_x = new ArrayList(); array_y = new ArrayList(); array_status = new ArrayList(); } // タッチパネルを操作した時に呼ばれるメソッド @Override public boolean onTouchEvent(MotionEvent event) { //return super.onTouchEvent(event); // 座標を取得 int x = (int) event.getX(); int y = (int) event.getY(); // イベントに応じて動作を変更 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // タッチパネルが押されたとき case MotionEvent.ACTION_POINTER_DOWN: array_x.add(new Integer(x)); // 座標を配列に保存 array_y.add(new Integer(y)); // 線の描画はしない(false) array_status.add(new Boolean(false)); invalidate(); // 画面を強制的に再描画 break; case MotionEvent.ACTION_MOVE: array_x.add(new Integer(x)); // 座標を配列に保存 array_y.add(new Integer(y)); // 線の描画をする(true) array_status.add(new Boolean(true)); invalidate(); // 画面を強制的に再描画 break; case MotionEvent.ACTION_UP: // タッチパネルから離れたとき case MotionEvent.ACTION_POINTER_UP: array_x.add(new Integer(x)); // 座標を配列に保存 array_y.add(new Integer(y)); // 線の描画をする(true) array_status.add(new Boolean(true)); invalidate(); // 画面を強制的に再描画 break; } return true; } // ビューの描画を行うときに呼ばれるメソッド @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 背景を白色で塗りつぶす Paint p = new Paint(); p.setStyle(Paint.Style.FILL); p.setColor(Color.WHITE); canvas.drawRect(new Rect(0, 0, canvas.getWidth(), canvas.getHeight()), p); // 描画用のPaint オブジェクトを用意 //p = new Paint(); pen.setStyle(Paint.Style.STROKE); //pen.setColor(Color.BLUE); pen.setStrokeWidth(2); // 配列内の座標を読み出して線(軌跡)を描画 for (int i = 1; i < array_status.size(); i++) { // 描画するように(true)状態値が与えられているとき // 一度離してしてから次に押されるまでの移動分は描画しない if ((Boolean) array_status.get(i)) { // 開始点の終了点の座標の値を取得 int x1 = (Integer) array_x.get(i - 1); int x2 = (Integer) array_x.get(i); int y1 = (Integer) array_y.get(i - 1); int y2 = (Integer) array_y.get(i); // 線を描画 canvas.drawLine(x1, y1, x2, y2, pen); } } } //画像の保存メソッド public void saveToFile(){ //保存先の決定 String status = Environment.getExternalStorageState(); File fout; if(!status.equals(Environment.MEDIA_MOUNTED)){ fout =Environment.getDataDirectory(); } //ファイルがなければ新しく作る else{ fout = new File("/DrawingApp"); fout.mkdirs(); } //名前に年月日をつける Date d = new Date(); String fname = fout.getAbsolutePath() + "/"; fname += String.format("%4d%02d%02d.png",(1900+d.getYear()),d.getMonth(),d.getDate()); //画像をファイルに書き込む try{ FileOutputStream out = new FileOutputStream(fname); bmp.compress(Bitmap.CompressFormat.PNG,100,out); out.flush(); out.close(); } catch(Exception e){ } } public void setPen(int color){ pen.setColor(color); } }

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

xml

<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <■■■■■■■■■■■■.MyView android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/saveButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginEnd="296dp" android:layout_marginRight="296dp" android:text="Save" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/blueButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginStart="8dp" android:text="Blue" app:layout_constraintStart_toEndOf="@+id/redButton" tools:layout_editor_absoluteY="0dp" /> <Button android:id="@+id/redButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginStart="20dp" android:text="Red" /> </android.support.constraint.ConstraintLayout>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Android Studio

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