EDIT MODE

モバイルアプリ開発に関することを書いています

DroidKaigiで発表してきたこと+ちょっと追記

4/25(土)にDroidKaigiという、Androidエンジニア向けのカンファレンスに参加しました。 今回は久しぶりに運営側として参加したり、発表もさせて頂きました。

運営側視点では、圧倒的当事者意識の体現者である @hotchemi さんが、素晴らしいまとめを書いてくださっているので、ここでは発表した内容の補足や追記をしたいと思います。

DroidKaigiの運営進め方共有(ギークに憧れて)

発表したこと

DroidKaigi当日は、会場Bの方で「JellyBeanとKitkatで実現するマテリアルデザイン」というタイトルで発表しました。 3日前にアップデートされたSupportLibrary-v22.1の中で、主にAppCompat-v7の変更点に触れながら、SupportLibraryを使ったマテリアルデザインの実現方法を解説しました。

4/22日の時点で既に7割ほど出来ていた資料でしたが、SupporLibraryが22日朝に大きくアップデートされたため、急遽一から資料を作り直すことにしたという貴重な体験が出来ました。

結果、「最新情報をキャッチアップした内容が聞けて良かった」という感想を頂く事が出来たので、書きなおしてみて良かったです。 ただ、何を資料に載せるか悩みながら書いたので、今振り返るといろいろと不足していたなと感じる部分が多々あります。

また、発表中にv22.1.1というマイナーアップデートが観測されるというミラクルも起きたので、その部分についても補足したい欲が出てきました。ということで、ここからは上記資料で書ききれなかったことを追記していきます。

1. 新しいInterporatorについて

資料の中で実際にアニメーションさせた動画を載せたのは良かったものの、新しいInterporatorはどういう良さがあるのかきちんと説明出来てないなと思いました。

公式ではAnimation > Authentic motionにて

To draw attention to an object for a specific purpose, or to add character to an animation, vary its change in speed when starting and stopping.

とあります。

また日本語でもこちらに

ゆっくりと始まり、ゆっくりと終わる典型的な遷移とは異なり、マテリアル デザインにおけるオブジェクトは素早く動き始め、ゆっくりと最終位置につきます。(中略)結果としてユーザーは遷移動作が終わるのを待つ必要がなくなり、モーション化によるマイナス効果は最小限に抑えられます。

とあります。

つまりは、アニメーションを見せつつ、ユーザーがその変化から受けるネガティブな面を、極力小さくするということのようです。微妙な違いではあるけど、Lollipop端末を触ってみるとその違いは大きいのが良く分かります。

とても理にかなっているなと思うので、Kitkat以下でも同様の表現が出来るようになったのは嬉しいですね。

2. v22.1.1について

DroidKaigiでの発表が終わる(16:30くらい)頃、数名の方から「v22.1.1が出たみたいだよ!」と声を掛けられました。会場設営のため朝早く脳が活動低下してきていたので、最初意味が分かりませんでした。

しばらくして調べてみたら、主にbug fixesがメインっぽかったのでホッとしました。主にRenderScriptまわりのbug fixesのようでした。

差分について、最初に書いた内容が誤りだったため訂正します。(4/29追記)

指摘くださったのは、DroidconMontrealでJake神にどら焼きを届けるという偉業を成し遂げた zaki50 さんです。ありがとうございました!

ソースのDiffを取ると分かるとのことだったので、取ってみました。

$ diff support-v4-22.1.0-sources.src/android/support/v4 support-v4-22.1.1-sources.src/android/support/v4
diff --git a/support-v4-22.1.0-sources.src/android/support/v4/view/LayoutInflaterCompatHC.java b/support-v4-22.1.1-sources.src/android/support/v4/view/LayoutInflaterCompatHC.java
index ee1a413..06e72f4 100755
--- a/support-v4-22.1.0-sources.src/android/support/v4/view/LayoutInflaterCompatHC.java
+++ b/support-v4-22.1.1-sources.src/android/support/v4/view/LayoutInflaterCompatHC.java
@@ -49,7 +49,16 @@ class LayoutInflaterCompatHC {
         final LayoutInflater.Factory2 factory2 = factory != null
                 ? new FactoryWrapperHC(factory) : null;
         inflater.setFactory2(factory2);
-        forceSetFactory2(inflater, factory2);
+
+        final LayoutInflater.Factory f = inflater.getFactory();
+        if (f instanceof LayoutInflater.Factory2) {
+            // The merged factory is now set to getFactory(), but not getFactory2() (pre-v21).
+            // We will now try and force set the merged factory to mFactory2
+            forceSetFactory2(inflater, (LayoutInflater.Factory2) f);
+        } else {
+            // Else, we will force set the original wrapped Factory2
+            forceSetFactory2(inflater, factory2);
+        }
     }

     /**

発表でもリンクを貼ったGoogle+の投稿のコメント(4/25 IanLake氏)に、

FYI, 22.1.1 is available now with the fix for widget tinting inflated from fragments. Thanks for the reports everyone!

ともありました。(確認不足でした。すみません。)

3. support.design.widgetパッケージ?

すみません、これは完全に脱線した内容ですが、2について調べている過程でSupportLibraryのリポジトリを見ていたら、support.design.widgetという見慣れないパッケージがありました。 中を見るとFloatingActionButton.javaが存在してました。他にも、NavigationDrawerView.javaやTabLayout.javaがあります。

f:id:androhi:20150428012534p:plain

気付かなかっただけかなと思い、ローカルにDLしたSupportLibrary-v22.1.1を見たけど、やっぱりありませんでした。もしかしたら、ついに公式のFloatingActionButtonなどがリリースが近いのかも。

4. AppCompatDelegateについて

Google@yuichi_arakiさんの、SupportLibraryでもPreferenceActivityが使えるようになった、というツイートを見かけたので確認してみました。

AppCompatではv22.1でAppCompatDelegateという抽象クラスが追加されてます。このクラスを使えば、どんなActivityクラスにもAppCompatの機能を継承することが出来るようです。

この仕組みを使って、PreferenceActivityにAppCompat(ActionBar的な機能)を追加できるということでした。詳細はAppCompatPreferenceActivity.javaというサンプルコードがあるので、それを見れば一目瞭然でした。便利ですね、AppCompatDelegate。

SupportLibrayのサンプルコードは、Platformのサンプルと同様に、SDK Manager経由で取得します。Extrasの中にあるAndroid Support RepositoryAndroid Support Libraryを最新にすると、以下の手順でサンプルプロジェクトを見ることが出来ます。

今回見たいAppCompatPreferenceActivityは、Support-v7のサンプルなのでSupport7Demosというプロジェクトに入っています。

  1. SDK ManagerでSupportLibraryのv22.1.1をDLする
  2. AndroidStudioでFile > New > ImportProject...を選択する
  3. [sdk]/extras/android/support/samples/Support7Demosを選択する
  4. ライブラリの依存関係が未設定なのでapp/build.gradleに以下を追加する
dependencies {
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.android.support:cardview-v7:22.1.1'
    compile 'com.android.support:gridlayout-v7:22.1.1'
    compile 'com.android.support:palette-v7:22.1.1'
    compile 'com.android.support:mediarouter-v7:22.1.1'
    compile 'com.android.support:recyclerview-v7:22.1.1'
}

f:id:androhi:20150428012625p:plain

まとめ

発表のまとめの最後に、今年のGoogle I/OがMaterialDesign発表後の最初のI/Oなので、今後に関する何かしらの発表があったらいいなと言いましたが、今回新たなパッケージを見つけたり、SupportLibraryは今後も進化していきそうなので、楽しみな流れになってきたと思います。

日本の通信キャリアから発売されてるAndroid端末は、いまだにLollipopへのアップデートが全くの未定です。SupportLibraryによってKitKatでも、少ない労力で適切にMaterialDsignのメリットを活かすことが出来るようになればいいなと思いました。