初めて Android アプリを作るまで１ヶ月だらだらとやったこと


#はじめに

これは私が Android をつくるために行ったことを書き記した日記みたいなものです。
これから Android アプリを作りたい方は参考というか励みにしてもらいたい。

# 私の説明

* とある Web 会社に勤務
* 個人的な役職はフロントエンドでアプリ制作経験なし
* 社内に iPhone の人はいるが、Android の人はいない
* 案件もない。けどこれから来れば嬉しい。是非弊社(個人的に僕でもいいですよ。)に案件を。
* Java は真面目にしたことない

私のいる会社は主に web ですが、アプリの引き合いはそこそこくる。
その内に iPhone ができる人はいるんだが、Android がいない。
会社にフロント系の人は少なからずいるし、このままだと新米の私のポジションは不利になるままだ。。。
ならばここでアプリでもつくったったるわーということで活動開始したわけです。

# 制作物

しかし、都合良く案件があるわけでもない。
そこで以前制作した (記事もあるよ) `Awwward まとめくん`のアプリを作ろうではないか。

ちなみに出来上がったものは

https://play.google.com/store/apps/details?id=com.mj.mjtumblrblog

ここにあるので参考までに。

#### Awwward まとめくん

http://qiita.com/monpy/items/b6ebe9bc77b3ad0ffade

の際に制作した `Awwwards` の感想を Tumblr でまとめるサイトである。

またも Tumblr 様の力を借りて 0円 で記事配信アプリをつくってしまおうというわけです。

# 制作スケジュール

表題にあるように１ヶ月かかった。業務の傍ら、土日などを使ってだらだら制作した結果時間がかかった。しっかりとりくめば１週間で終わる内容だろう。ださいことこの上ない。

# 本を買う

とにもかくにも、アンドロイドの本を買った。
別会社の尊敬する先輩に勧められた本で。これさえあれば大体おkとのこと。

ちなみにこの本である。
[Androidプログラミングレシピ増補改訂版 アーキテクチャ/UI/ネットワーク編](http://www.amazon.co.jp/gp/product/4844334751/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4844334751&linkCode=as2&tag=monpy-22)

よっしゃこれさえあれば上手く行く！！

#### そんな上手くいきませんでした。

嘘だった。確かにこの本にはいいことが書いてあるが

* Android Studio どうすんだ
* まずなんのファイル弄ればいいんだ
* レイアウトとかどうすればいいんだ

等、まぁそうだ。といった感じで心が折れた。これで 1 週間が死んだ

#### その分サイトの構造を妄想した１週間だった

本のおかげで単語の知識はついて
何を具体的に覚えればいいか悟り始める

* アクティビティの構成要素を記述するのと、基本的なプロパティを知ること
* リスト形式のレイアウトの出し方
* web 通信の仕方、画像の読み込み
* アニメーションさせる

等である。幾つかの解決は本に載っていたが、イマイチ根本が分かっていないのでピンとこなかった。

# 神サイト ドットインストール

こうなったらドットインストールするしかない。初歩を理解するにはこれがよいと判断

**ステマ**じゃないけど、Android アプリをつくろうみたいなレッスンがちょうど開始していた。有料だが、その価値はあったと思う。

API のバージョンもほぼ同じだし、現環境を理解するのは最適だった。
普段は流し見程度で終わるドットインストールを深夜アニメをみるかのように何回も聞きコードを写経した。

そうしたら、次のことが理解できた。

* アクティビティの構成要素
* レイアウトの組み方
* リストの出し方とか
* なんとなーくの Java の書き方

よっしゃこれがあれば、後は少し応用すればいけるやん！！

#### そんな上手くいきませんでした。

確かにリストもだせようになったし、リスト用のレイアウトも組めた。

しかし **アニメーション系の処理**　でつまづいた。

個人的なコンセプトとして、リストをタップするとビョイーンと開いてそのまま詳細ページになるというオシャンティーな構造にしたかった。

そのビョイーンをアニメーションさせたかったのだが、本にあるアニメーションの参考コードも動かない。なぜだ！

* height とかある程度の値は特別に処理を記述する必要がある
* アニメーションのアップデートがその際フレーム毎に呼ばれるので `interpolatedTime` の値(0-1) の値から height の値を計算してあげる必要がある

`opacity` とか `rotate` とかはある程度用意された関数に値をわたせば処理してくれたが、 height は 0 から 1 の状態へ飛んでしまったので注意が必要でした。

そうこうしてる内に１週間がたった。

# そろそろソースコードがごちゃついてきた

問題自体はかなりの解決があったが、Tumblr の API を非同期にとって来た際の コールバックの処理とかの管理が大変になってきた。

ここからは、何かのパターンに乗っ取らないと首を絞めると察知。先輩に助言を請う。

そうして導入したのが、`MVP`パターンである

#### MVP

* Model
* View
* Presenter

の頭をとって MVP と呼びます。Presenter の部分が Controller になってると、有名な `MVC` パターンですね。

`MVC` は `MVC` の亜種らしく。それほど大きくないプロジェクトだと `MVP`で十分らしい。

まぁ詳しい説明は長いので割愛するのですが、とても良く出来ています。

特にサンプルを読むのが一番良い。
https://github.com/antoniolg/androidmvp

これを読むといかに Interface の実装が大事かが理解できます。
個人的には、よく Javascript の設計で `Emitter`(Manager) を介してイベントを管理することが少なくないと思いますが、それに近しい感覚を覚えました。なので個人的には導入しやすかったです。

そうして１週間がたった。

# 残すはイベントの処理

大体の構築は終わり、残す大きな課題は **スクロールさせない処理** の実装でした。

先に話した通り、このアプリは **リストViewと詳細View** の状態を両立させるのが目的で、詳細View の時はリストのスクロールを止めたいわけです。

#### 意外と理解しにくいイベント管理

とりあえず、ここを読んで理解したつもりになりました。

http://blog.lciel.jp/blog/2013/12/03/android-touch-event/

でここで勘違いしたのが、

* リストのスクロールイベントをtrueで返せば動かないだろう
* `requestDisallowInterceptTouchEvent` の仕様


まず リストのスクロールイベントを true 返しても、子にスクロールイベントがある場合には微妙に動きます。なんか正解に近い様な気がして永遠ここら辺を彷徨いました。

そして　`requestDisallowInterceptTouchEvent` の仕様です。
私は、親が  onInterceptTouchEvent() でイベントを明示的に止めている際の救済措置かと思っていました(まだ合っていると思っている)。。
実際のところは、子が親に対して "俺のイベントの邪魔をするなよ" という命令が出せる模様。
あと重要なのが、タッチイベントの際には毎回これを読んであげなくてはならない点も重要ですね。
イマイチ理解できていないので説明得意な方は私と会いましょう。

リストの子要素に `ScrollView` や `FrameLayout` とかスクロール系の処理が入っていると処理が面倒になるのでご注意を。。。

# 出来た！！

色々ありましたが、できました！まだまだ課題はありますが、とにかく作るのが大事ですね！

とりとめのない記事になりましたが、読んでくださった方の参考になれば幸いです。

フロントエンドがいきなりアプリ開発とか正直キツいですがなんとかなるもんです。一緒に頑張りましょう。

#### Android の仕事ほちい

ほちい。