4/25(土)にDroidKaigiという、Androidエンジニア向けのカンファレンスに参加しました。 今回は久しぶりに運営側として参加したり、発表もさせて頂きました。
運営側視点では、圧倒的当事者意識の体現者である @hotchemi さんが、素晴らしいまとめを書いてくださっているので、ここでは発表した内容の補足や追記をしたいと思います。
発表したこと
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 さんです。ありがとうございました!
@androhi “主にRenderScriptまわりのbug fixesのようでした。" というのはどっかに情報出てました?support-v4のソースの差分を見たら、Fragment#onCreateView()のinflaterでMaterialにならないというバグ修正が
— zaki50 (@zaki50) 2015, 4月 28
ソースの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があります。
気付かなかっただけかなと思い、ローカルに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 Repository
とAndroid Support Library
を最新にすると、以下の手順でサンプルプロジェクトを見ることが出来ます。
今回見たいAppCompatPreferenceActivity
は、Support-v7のサンプルなのでSupport7Demos
というプロジェクトに入っています。
- SDK ManagerでSupportLibraryのv22.1.1をDLする
- AndroidStudioで
File > New > ImportProject...
を選択する [sdk]/extras/android/support/samples/Support7Demos
を選択する- ライブラリの依存関係が未設定なので
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' }
まとめ
発表のまとめの最後に、今年のGoogle I/OがMaterialDesign発表後の最初のI/Oなので、今後に関する何かしらの発表があったらいいなと言いましたが、今回新たなパッケージを見つけたり、SupportLibraryは今後も進化していきそうなので、楽しみな流れになってきたと思います。
日本の通信キャリアから発売されてるAndroid端末は、いまだにLollipopへのアップデートが全くの未定です。SupportLibraryによってKitKatでも、少ない労力で適切にMaterialDsignのメリットを活かすことが出来るようになればいいなと思いました。