Androidで簡単お絵かきアプリ開発

Android開発の説明用資料です。
せっかく作ったのでアップしました。

# お絵かきアプリの機能

- 指でなぞったところが線になる
- 書いた絵を消すボタンがある

以上！

# プロジェクト作成
Android Studioで新たにプロジェクトを作成します。
アプリ名は適当に設定します。
初期生成されるActivityをBasic Activityに設定する以外は全部そのままで大丈夫です。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/f8203768-e5b1-fdcd-da02-ddbd7377e3ea.png)

# 絵を描くためのクラスを作る
オリジナルのお絵かき用クラスを作成します。

## まずはクラスを作る
画面左側のプロジェクトウィンドウからMainActivity.javaを右クリックしてNew→Java Classを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/a4182206-7bf5-3bdd-f0f1-08521886902c.png)
名前はわかりやすいものにして、Superclassに`android.view.View`を指定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/579f4044-d407-73a7-dd14-538dc1ea4c02.png)

### コンストラクタを作ってエラーをなくす
コンストラクタがないためにエラーが出ているはずです。
コンストラクタを追加します。

```java:PaintView.java
public class PaintView extends View {
    public PaintView(Context context) {
        this(context, null);
    }

    public PaintView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}
```

### 描画用の変数の宣言と初期化
画面に線を書くためのPaintとPathを用意します。
さきほどのコンストラクタに初期化プログラムも追記します。

```java:PaintView.java
public class PaintView extends View {

    private Paint paint;
    private Path path;

    public PaintView(Context context) {
        this(context, null);
    }

    public PaintView(Context context, AttributeSet attrs) {
        super(context, attrs);
        path = new Path();
        paint = new Paint();
        paint.setColor(0xFF000000);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeWidth(10);
    }
}
```

### 画面を描画するメソッドを用意する
画面を描画するときに先ほどのpathとpaintを使用するようにプログラムを追記します。

```java:PaintView.java
public class PaintView extends View {
    /* 中略 */

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawPath(path, paint);
    }
}
```

### タッチしたら線を書くようにする
画面のタッチ情報を取得してPathを追加していきます。
コンストラクタとは別にonTouchEventメソッドを上書きします。

```java:PaintView.java
public class PaintView extends View {
    /* 中略 */

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                path.lineTo(x, y);
                invalidate();
                break;
        }
        return true;
    }
}
```

## 画面のレイアウトに作成したクラスを追加する
`content_main.xml`を開いてPaletteから`<view>`を追加します。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/539a5e93-97cf-387c-32cd-16194b989fbd.png)
この`<view>`を画面の適当なとこにドラッグアンドドロップします。
その時にどのクラスを使用するか聞かれますがそこは先ほど作ったクラスを選択しましょう。

## 画面めいっぱいにキャンバスを広げる
先ほどのViewの幅と高さを画面いっぱいになるように設定します。
追加したViewを選択し画面右側のPropertiesを編集します。
幅と高さは親要素に合わせる`match_parent`にします。
このときに最初からあるHello worldと書かれたTextViewは削除してしまいます。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/d1535e94-fa03-3da1-214b-c0d4d7db0adf.png)

# 一旦完成
ここまででとりあえず線はかけるようになっています。
実際に実行して確認してみましょう。
![device-2016-10-28-020848.png](https://qiita-image-store.s3.amazonaws.com/0/113969/365a79fb-3941-3148-1af5-b53a37db4e83.png)

## 画面に描いたものを消す
このままでは書くだけしかできないのでメールのボタンを押したときにすべて消すようにします。

### 削除するメソッドを作成する
先ほど作成したオリジナルのクラスに線を削除するようなメソッドを追加します。

```java:PaintView.java
public class PaintView extends View {
    /* 中略 */

    public void clear(){
        path.reset();
        invalidate();
    }
}
```

### 削除するメソッドを呼び出す
`MainActivity.java`を開いてonCreateの中を書き変えます。
Snackbar...となっている部分で画面上のオリジナルクラスを呼び出してリセットを掛けます。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/4840ff08-943d-c3a8-85d7-eda87eabc0b3.png)

## ボタンのデザインを変える
メールのアイコンには違和感があるのでゴミ箱に変更します。

### 画面のレイアウトファイルを開く
`app/res/layout/activity_main.xml`を開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/e516beca-e894-53de-f5b1-2d00b4520e96.png)

### アイコンのデータを変更する
アイコンをクリックし画面右側のPropertiesからアイコンイメージを変更します。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/dd4ab050-cb5f-99aa-1d42-018f7931dd48.png)
`ic_menu_delete`を探し、選択し、OKボタンを押下します。
![image](https://qiita-image-store.s3.amazonaws.com/0/113969/d9d07281-10cc-c263-77f2-ca07d04ddc35.png)

# 完成
これで削除機能を備えたお絵かきアプリが完成しました。
`activity_main.xml`のアイコンをコピペして動作を増やしていくことでペンの色が選択できたり画像ファイルとして保存したりすることも可能です。