DroidKaigi2016に参加してみた - Kotlin / Espresso / Animation についての感想 -

2016年2月18日 ~ 19日にあったDroidKaigi2016に参加したので、そこで見聞きした情報 + 感想を纏めてみました

# ざっくりとした感想
 - Kotlin大人気
    - でもJavaにしか慣れていないと正直難しそう
    - 正式リリース直後のタイミングなので必要以上に盛り上がっている可能性もあるが、Kotlinセミナーへの参加者も多く今後Kotlinを取り入れたアプリが増えていきそう
 - Espressoを使いこなしたい
    - 現状ロジック周りのテストは行えているが、UI周りのテストの知見がないので学習していきたい
    - 自作Viewクラス等のテスト方法が分からなかったが、自作Matcher (後述) を使えば行けるかも…？
 - 画像/Animationが色々と進化しているしている
    - 自分がアニメーション、画像処理を行うアプリを作っていた時より色々とライブラリや機能周りが進化している
    - Picasso / Glide, Animationクラスの詳細については後述

---

# Kotlin
 - GoogleがKotlinをどう捉えているか、今後どうしたいかの考えは未だ不明の模様。
    - ただData Binding内部でKotlinが使われている(らしい)等、特別Kotlinを邪見にしている印象は無さそう
 - Kotlin関連のセミナーの内容を聞く限り、"これからKotlinを始める人へ"な印象が強く、現状Kotlinユーザーが大漁に居る印象はあまり無い
    - Kotlin ver1.0.0が正式リリースされた今、Kotlinを導入する企業やエンジニアは一気に増えていきそう
 - Kotlin関連のセミナーのスライドは以下の２つ
    - 既存のAndroidプロジェクトにKotlinを導入した話し
       - https://speakerdeck.com/boohbah/number-droidkaigi-ji-cun-falseandroidpuroziekutoni-kotlinwodao-ru-sitahua
    - Advanced Kotlin for Android
       - https://speakerdeck.com/ntaro/advanced-kotlin-for-android-number-droidkaigi-number-droidkaigib

## Kotlinの良い所
- null安全
   - 各変数に**nullを代入して良いか (nullableか) **の設定が存在するため、気がつけばnullが入っているということがなく、nullPointerが発生しない仕組み
   - JavaとKotlinのハイブリッド式の場合は**上記の通りではない**ため注意が必要
      - Javaで記述したStringを返す関数の結果をKotlinで記述した変数に代入する際、その変数がnullableかどうかを選べる
      - Kotlinのnullableでない変数に上記関数の結果を代入し、かつ戻り値がnullだった場合にはnullPointerが発生する可能性が出てしまう
         - というよりnullableでない変数のnullチェックは基本行わないのでリスクが膨れ上がりそう
- ソースの記述量が減る
    - 一行関数(Single Expression Function)では {} の記述が不要
    - Dataの保持のみを目的としたData Classが存在する
    - スコープ関数があり、処理の流れが可視化しやすい
        - http://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e
- Swiftに似ている(?)ためiOSエンジニアとの連携が取りやすいらしい
- 便利なAnnotation集
    - @JvmFields
        - Javaから参照する際、getter / setterではなくプロパティアクセスができるようになる
    - @file:JvnName
        - 拡張関数の定義時に使用する
        - Javaから参照する際、JvnNameで指定した名前の配下にあるかの様に呼び出せる
            - Kotlin側の定義
                - ```@file:JvnName("sampleJvnName")
String.extMethod = "some random return"```
            - Java側での呼出し
                - ```sampleJcnName.extMethod();```

## Kotlinの悪い所
- Java -> Kotlinの移行に時間がかかる
    - JavaコードをKotlinコードに一瞬で変換する機能はあるが、Kotlinの利点を得るためにはあまり使わない方が良さそう
- ver1.0.0リリース前までは動作が安定していないバージョンが多かった
    - 正式リリースした以上、今後はそういう事が少ないとは思うが、まだ確証はなさそう
- KotterKnifeを使う場合、Fragmentは使わない方が良さそう
    - "retainInstance = true"と定義した場合にLeakが発生する

---

# Espressoで行うUIテスト
- http://chiuki.github.io/advanced-android-espresso/#/
- UI AutomatorやEspresso等、UIに関するテストが出来ていない状態なので是非今後参考にしていきたい
- 基本的にソースをベースにした説明だったので、詳しくはスライドを参照

## Espressoとは
- 自動でUIテストをしてくれる便利な子
- ちゃんとUIの生成完了を待ってくれたり、明示的にsleepさせたりする必要もない

## CustomViewをEspressoでテストするために…
- CustomMatchersを使うことでテストができ**そう**
    - http://chiuki.github.io/advanced-android-espresso/#/18
- Dagger / Mockito等を使う事でテストできる範囲が大幅に増える
- 色々とサンプルソースもスライド内に存在するので、是非触ってみたい

---

# 進化したアニメーション
 - http://www.slideshare.net/TakaoSumitomo/ss-58409105
 - 割と初期のAndroidではViewの見た目だけ動いてTap判定はそのまま、というモノしかなかったが、今では色々と増えていたっぽい

## Animationの種類一覧
###View自身を動かすAnimation
- ViewAnimation
    - 上記の通り見た目**だけ**動かすAnimation
    - ボタン等のアニメーションをしても、タップ居位置は変わらないので注意が必要
- PropertyAnimation
    - 一番使い勝手が良さそうなAnimationクラス
    - ObjectAnimatorを使うか、ViewPropertyAnimatorを使うかの2種類の実装方法がる
        - コードだけで完結したい場合はViewPropertyAnimator
        - XMLも書いて良いよと言う場合はObjectAnimatorを使うと良い
        - ViewPropertyAnimatorの方がシンプル

### Viewの見た目だけ動かすAnimation
- AnimationDrawable
    - パラパラマンガやgifみたいなもの
    - 複数の画像を用意し、xmlで定義すれば使える
- AnimatedVectorDrawable
    - SVGをアニメーションさせる
    - XMLでSVGを作成すれば使える
    - 滑らかなアニメーションを表現できる

### 複数のViewを含むAnimation
- ActivityAnimation
- FragmentAnimation
    - 要はActivity画面自体のアニメーション
    - Activity / Fragment切り替え時に使う
- Transition
- ActivityTransition
- FragmentTransition
    - 要はAnimationの前と後での流れを定義して使うAnimation
    - ViewAを移動しながら画像を切り替える、等の場合に使うと良い

---

# おまけ (ImageLoaderライブラリ)
 - オススメなライブラリとして以下の３つがある
    - Picasso
    - Glide
        - 上記2つを比較している記事
            - http://qiita.com/rejasupotaro/items/ead90beaeaa2a6eace35
    - Fresco
        - http://qiita.com/yysk/items/1e5c06e2fd7688883773 

- 主な特徴は以下の通り
    - Picasso
        - 画像のデバッグが出来る
        - 導入に当たり増える容量が軽め
        - 関数の数が少ないため、使いやすい
    - Glide
        - Picassoと比べて表示が滑らか (FadeInする感じだった)
        - Picassoより処理の種類が多そう
    - Fresco
        - 比較的新しいライブラリ
        - View関連が強い
        - XMLで色々と指定が可能