はじめて作る(かなりの)クソAndroidアプリ

この記事は N高等学校 Advent Calendar 2019 の24日目の記事です。かなり血迷っています。

# ぴえんぴえん♡´･ᴗ･`♡わっしょいわっしょいべびたっぴ〜wwwwwwwwwwww

あけましておめでとうございます。
今年も終わるので流行りに乗ってみたN高1年の**エモ系ファッションエンジニアはぎたそ**です。
そーたとかハギーとかで呼んでください。
https://twitter.com/___soprog

主にAndroidアプリを書いています。
趣味では自称エモいアプリを作り、業務では毎日の料理を楽しくする会社のお手伝いを少しですがさせてもらっています。

得意なことはクラッシュ駆動開発です。

# はじめに

かなりひどいクソアプリを開発してしまいました。あまりにひどすぎてくだらなすぎるのでみんなにも作ってほしくなったので記事を書いています。コードコピペするだけで作れるのでぜひお好きにカスタムしてもっとクソにしてください。お願いします。

# 作っていくクソアプリ
実用性に長けたアプリです。
こちら👇

![20191223_233105.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/e9e416a9-efe8-78a2-b8a5-9b4341928129.gif)

**~なんか画像が怖くなるアプリ~**

です。このアプリを使えば怖くなります。

主な機能は

- 画像がぶるぶるして怖くなる

以上です。
意味がわからないかもしれませんが、やっていきましょう。やっていくことが大事です。

# つくる
#### わいの環境
- macOSMojave
- AndroidStudio3.5.3


## 開発環境の構築
Androidアプリ開発にはAndroidStudioという統合開発環境を使います。
残念ながらおじさんは面倒くさがりな不親切なので開発環境の構築については話しません。
これでも見ていい感じにやってください。
[Mac]
https://qiita.com/yacchi1123/items/75303c0ad05a188a28eb
Windowsだともう少し面倒なはずです。ググってください。

## プロジェクトを作る
Android Studioの設定を済まして起動をすると以下のような画面が表示されると思います。
<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/0de94384-075a-830e-279b-d564bd748839.png">
新しくプロジェクトを作るには、一番上の`Start a new Android Studio project`をクリックしてください。

クリックするとこんな画面が出るかと思います。
<img width="700" alt="スクリーンショット 2019-12-23 22.55.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/fa8569dd-723b-994e-e4aa-2a29d47ea928.png">
これはプロジェクトのテンプレートを選ぶ場所です。
今回はまっさらな状態で作りたいので、`Empty Activity`を選択してNextで次に進みます。
個人的にはテンプレートはあまり使わないです。
<img width="700" alt="スクリーンショット 2019-12-23 22.56.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/f3172aed-2dfa-8651-3ca5-514eb0e479fb.png">
次の画面は、上から
プロジェクトの名前、package名、保存先、言語、サポートするAndroidバージョンの下限を設定する画面です。

今回は
Name - Yabami (好きな名前)
Package name - me.soprog.yabami (適当で良い、ホントは一意に保つため自分の持ってるドメインをひっくり返して入れたりする。)
Save location -  (どこでも)
Language - Kotlin (もうAndroidではあたりまえ)
Minimum API level - API19 Android 4.4 (割と普通)
にします。

チェックックスは画像と同じ状態にして、finishをクリックしてください。
すると、こんな画面になります。
<img width="700" alt="スクリーンショット 2019-12-23 22.56.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/0158de2e-a26d-b787-46fc-960496e405c0.png">
ぐるぐるしてるのでぐるぐるが終わるのを待ってください。
<img width="700" alt="スクリーンショット 2019-12-23 23.29.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/51d2da33-79e5-dea7-f6e4-48234a606c01.png">
これでプロジェクトを作ることができました。

## 素材を読み込む
背景になる画像、メインの画像を探してきてください。
見つかったらファイル名を英小文字にし、resフォルダの中にあるdrawableフォルダに画像をコピペしてください。
<img width="339" alt="スクリーンショット 2019-12-24 0.53.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/535d01f7-aad5-f526-21e8-a6ded2ff66a1.png">
こんなかんじ。

## 書く
さて、コードを書いていきます。

Androidは、見た目とロジックを別のファイルにわけて記述していくことが多いです。
見た目はxml、ロジック部分はKotlinで書きます。
その２つをそれぞれ紐付けして形にしていくわけです。
プロジェクトを作った状態ですでに`MainActivity.kt`と`activity_main.xml`というファイルがあると思います。(shiftキーを二会押すとかんたんに検索することができます。)
このファイルたちに変更を加えて怖いアプリを作っていきます。

今回は見た目を先に作ってしまいましょう。
`activity_main.xml`を開いてください。ここで見た目を作っていきます。
Android StudioにはGUIでレイアウトを構成できるモードと、xmlをベタで書いて構成するモードがあります。
一見GUIのほうが楽に感じるかもしれませんが、GUIはかなり使いにくいのでxmlで記述していきましょう。
<img width="700" alt="スクリーンショット 2019-12-24 0.29.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/e1fa4020-61b7-71f0-323a-988459c00c5f.png">
下の方のTabになっているところのTextボタンをクリックします。
<img width="700" alt="スクリーンショット 2019-12-24 0.29.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/ca92f346-aef5-b606-1508-5c40a2ef50f7.png">
こうなります。

一度すべて消してから下のコードをコピペしてください。

``` xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
    android:background="@drawable/背景画像のファイル名"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/メイン画像のファイル名"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="32dp"
        android:gravity="center"
        android:text="お好みの文字列を入れてね"
        android:textColor="お好みのカラーコードを入れてne"
        android:textSize="40sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
```

これでレイアウトができました。

この状態で一度実行してみましょう。
実行方法はこの辺を見てください。
https://qiita.com/noriseto/items/fe6eca453713051be218#%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A7%E5%AE%9F%E8%A1%8C

...

何も怖くないです。今のままだとまだ何も怖くないのでぶるぶるさせて見た人を恐怖のどん底に落としこむようなものにしていきましょう。

`MainActivity.kt`を開いてください。
これをコピペして(((

```kotlin:MainActivity.kt
package me.soprog.yabami

import android.os.Bundle
import android.view.animation.*
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val alphaAnimation = AlphaAnimation(1f, 0.6f).apply {
            duration = 1500L
            repeatMode = Animation.REVERSE
            repeatCount = Animation.INFINITE
        }

        val translateAnimation = TranslateAnimation(0f, 10f, 0f, 20f).apply {
            duration = 10L
            repeatMode = Animation.REVERSE
            repeatCount = Animation.INFINITE
        }

        val rotateAnimation = RotateAnimation(0f, 360f).apply {
            duration = 20L
            repeatMode = Animation.REVERSE
            repeatCount = Animation.INFINITE
        }

        text.startAnimation(
            AnimationSet(true).apply {
                addAnimation(rotateAnimation)
            }
        )

        image.startAnimation(
            AnimationSet(true).apply {
                addAnimation(alphaAnimation)
                addAnimation(translateAnimation)
                addAnimation(rotateAnimation)
            })
    }
}
```

実行してくだいさ。

...
...
...

![20191223_233105.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196211/e9e416a9-efe8-78a2-b8a5-9b4341928129.gif)
いええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええい！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！

`MainAcitivy.kt`の

```kotlin
val alphaAnimation = AlphaAnimation(1f, 0.6f).apply {
            duration = 1500L
            repeatMode = Animation.REVERSE
            repeatCount = Animation.INFINITE
        }

        val translateAnimation = TranslateAnimation(0f, 10f, 0f, 20f).apply {
            duration = 10L
            repeatMode = Animation.REVERSE
            repeatCount = Animation.INFINITE
        }

        val rotateAnimation = RotateAnimation(0f, 360f).apply {
            duration = 20L
            repeatMode = Animation.REVERSE
            repeatCount = Animation.INFINITE
        }
```
このへんの数値をイジイジすればアニメーションの挙動が変わるので、自分が満足する怖さに仕上げてください。

ちなみに怖さを出すコツは

- 怖い画像を使う
- ヒステリックに動かす

ことです。

## さいごに
クリスマスイブにかなりひどい記事を出してしまったことをお詫び申し上げます。
みなさんも無茶なアドベントカレンダーへの立候補にはお気をつけください。
ご機嫌よぅ。