新しいUIパターン:サイドナヴィゲーション
FacebookアプリlikeなUI(画面にかぶさるようにしてメニューが出せるやつ)についての記事を見つけたので訳しました.執筆者の承諾を得ています. Thank you for your kindness, @lehtimaeki!!
(こちらの記事の翻訳です)
Juhani Lehtimaeki ( @lehtimaeki )さんの記事.文中「私」とあるのは @lehtimaeki さんのことです.
記事のコメント欄も興味深いです.
本文
AndroidのUIは去年,すごいスピードで発達した(特に私のお気に入りのものについては, *こちら1* にまとめてある ).ほとんどの変化はたいしたものではなかった(4.0から採用されたholoテーマ,Robotoフォントなど).登場したときUI界を大きく変えたと言えるのがあるとすれば,今回紹介するSide Navigationかもしれない.
FaceBookのSide Navigationは,最近いくつかのアプリにほとんど同時に採用された.最初はSpotify,直後にEvernoteが続いた.Google+もだ.
それぞれ実装はかなり異なるし,ルック&フィールも異なるが,背後にあるアプローチは同じだ.ユーザに提供すべきなのは,いまいるスクリーンから離れないままで,アプリの最重要部分にアクセスできるショートカットだ,ということだ.
見た目の違いはかなりはっきりしている.Google+アプリは上からナビゲーションが降りてくるが,ほかは横から出てくる.また,Google+だけは「上へ」アイコン(up caret)もアクションバーも出しているが,他のアプリは出していない.
このパターンについてのおもしろい議論は *こちら2* で見られる.
Dashboardパターンは用済み(っぽい)
Side Navigationパターンは,批判を受けてきたDashboardパターンにとってかわる.Dashboardパターンへの主な批判は,ユーザがアプリの中身にたどり着く速度を落としてしまう,というものだ.アプリを起動するたびに,何をしたいかに応じてアイコンをタップしなくてはいけない.
さらにDashboardパターンだと,他のことをしたくなったらまたアプリのホーム画面に戻ってこないといけない.Dashboardがあって,項目のリストがあって,項目をタップするとその詳細が見られる,という一般的なAndroidアプリのワイヤフレームを軽く描いておいた(モバイルアプリだとよくある構造だ).この例では,ユーザは最初にダッシュボードから項目をタップして,リストの項目を1つ選んでタップして,詳細画面から別の項目へ移る.これでは,アプリの別のセクションに誘導するのは難しい.
Side Navigationパターンは,これらの問題を両方とも取り除く.アプリのメイン部分であればどこへでも,ユーザは直にアクセスできる.したがって,アプリは起動時から,前回起動時の画面を表示することができる.Dashboardはいらない.中身に直接つなげるのだ.
先ほどのアプリを,Side Navigationパターンに変えたもののワイヤフレームを置いておく.第1に,アプリのランディング画面でもう中身を見ることができ,アプリの他の部分にも,ユーザはアクセスできる(しかも,どの画面からでも).
これはSide NavigationパターンがDashboardパターンに勝っている部分だろう.Dashboardパターンを使うべき例は,まだ残りはするだろうが限られてくるに違いない.たとえば,アプリのどの画面でもランディング画面にする,というのが不可能な場合が,稀にはあるかもしれない.あるいは,非常に複雑なアプリだと,ユーザが最初にアクセスしたときに見るものは,画面どーん!ではなくて,それほど威嚇的ではないダッシュボードのほうがいいかもしれない.
Android UIの象徴だったもののひとつ,つまりDashboardパターンにさよならする日は,それほど遠くはなかろう.
Side Navigationには欠点もある
残念ながら,Side Navigationでうまくやるのは,Dashboardでうまくやるよりも難しい.複雑さが増すからだ.
上へ?
Androidoの「上へ」概念のことはぜんぜん好きになれない.「上へ」と「戻る」との違いをユーザが理解するのは不可能なんじゃないかと思う.Googleは,左向き矢印を「上へ」を表すものと決めたようだが,これではちっともわかりやすくなっていない.だれに聞いてみても,左上のボタンは「戻る」ボタンと呼ばれてばかりだ.
Side Navigationは,「上へ」をよけいなものに変えてくれたと思う.あなたのアプリがちゃんと作ってあって,メイン画面からSide Navigationを通じてどこへでも行けるようにしてあるなら,ユーザはもはやどのスクリーンからも,ほんの数クリック以上に離れてしまう(深い階層に行ってしまう)ことはないからだ.「戻る」ですべて事足りる.
Google+アプリを見て,Side Navigationの動きがわかったら,カテゴリーのホーム画面に戻ってSide Navigationにアクセスするには,まず「上へ」しないとだめだということに気づくはずだ.これでは利点より欠点のほうが勝ってしまっている.たとえば,自分のフィードアイテムを読んでいて,突然グループチャットをしたくなったときに,フィード詳細画面からフィード一覧画面に「上へ」で戻ってからでないと行けないというのは,ばかげている.
左上には,「上へ」のかわりにホームアイコンを置いて,どこにいようがSide Navigationを開けるようにしておくべきだ.
それでも「上へ」を使いたいなら,Side Navigationをホームアイコンから開ける場合には「上へ」矢印を消し,開けない場合には「上へ」矢印を出す,という制御をすべきだ.「上へ」矢印を出しっ放しにしたままでは,UIの大原則「ボタンがすることは常に見れば想像がつくようにしておけ」を破ってしまう.
おそらく,Side Navigation用に,OSレベルでアイコンを用意しておくべきだと思う.そのほうが一貫性が出る.何を言っているかわかるように絵を描いておいた.1枚めは「上へ」として動くホームボタン,2枚めは「Side Navigationを開く」として動くホームボタン.どうしても「上へ」を使いたいアプリでも,これでユーザの混乱は避けられるだろう.
「戻る」のスタック問題
「戻る」のスタックを正しく積んでおくのは重要だ.Side Navigationは戻るスタックを複雑にしてしまう.Alexander Blomがこの問題について書いている記事は *こちら3* 、 *こちら4* 。
Side Navigationはどの動作で開くのか?
ユーザがSide Navigationを開きたいとき,どうすればいいだろうか? どういうジェスチャを採用すべきか?
Side Navigationはアプリの最重要要素になるので,これを開けないとユーザは何もできない.
いろいろなアプリを試してみたが,完璧と思えるものは見つからなかった.いちばんよかったのはPrixingアプリだ.「上へ」は捨てて,Side Navigationに特化したホームボタンをつけている.
このアプリはさらに,ジェスチャショートカットも備えている.画面のふちをスワイプすればSide Navigationが開く(Bezel Swipe).画面ふちスワイプは,最初に気づくのが難しい場合もありうるが,ホームボタンを押せば同じことがどの画面でもできるのであれば,問題にはならない.(Bezel Swipeについては *こちら5* )
あと改善するとしたら,ホームボタンとして使っているのがアプリアイコンそのままであるという点だけだ.どういう動きをするのかわかるようなアイコンを別に作るべきだろう.
他のアプリでは,他のやりかたでSide Navigationを開いている.例えばEvernoteアプリはUI上でSwipeして開く.この場合,タブを移動するのにSwipeを使っているアプリでは,それと被ってしまうという問題がある.Evernoteの場合,タブをUIで使っているあいだは,左端のタブまで行かないかぎり,サイドメニューをジェスチャでは開くことができない.
おすすめの方法は,ホームボタンから開けて,画面ふちスワイプでも同じように開けるようにしておく,というものだ.「上へ」を使う必要があるなら,Side Navigationを開くボタンと異なるアイコンにすること.
Side Navigation内でのアクション
ナヴィゲーションのことばかり書いてきたが,多くの実装はそれ以上のものを作っている.正しい方向だと思う.アクションバーは,アクションバーが出ている画面に応じてコンテキストアクションを出しておく場所だった.では,どの画面からでも行けてほしい重要なアクションについては,どこに載せておくべきか?
Evernoteは,Side Navigationにアクションを載せることで対応している.優れた実装だと思う.最初はちょっと戸惑うかもしれないが,きれいに分割されたアクションとナヴィゲーションのおかげで,ユーザはすぐに脳内地図を作ることができる.
名前はなんにすべきか?
パターンの名前は,わかりやすく一貫したしかたでつけなくてはいけない.パターン化することの利点のひとつは,議論のとき簡単に共有できることだ.すでに確立したパターンは,それだけで説明不要になる.「UIにアクションバーをつけよう」「リストにクイックアクションをつけたらどうか」これだけでじゅうぶん意思疎通できる.
では,このパターンはなんと呼ぶべきだろうか? これまでSide Navigationと呼んできたが,他にもたくさんの名前がある:
- Side Navigation
- Fly-in app menu
- Slide out navigation
- Sliding navigation bar
- Slide Menu
- Facebook-like UI
Googleが名前をつけてくれるのを待つしかないだろう.ここで民主的な多数決などには頼れそうもない.いちおうここではSide Navigationで統一しておく.
技術的実装面
Side NavigationはまだAndroid SDKには入ってない.githubをざっと見まわしたところ,これが見つかった:
- GitHub - AlexKorovyansky/android-fb-like-slideout-navigation: DEPRECATED Facebook-like slide out navigation for Android
- ライブラリ版(コメント欄より.Mr BuBBLsに感謝): GitHub - darvds/RibbonMenu: Navigation menu for Android (based off Google+ app)
- そのほかライブラリ(1): Bitbucket
- そのほかライブラリ(2): GitHub - Gregadeaux/android-fly-in-app-navigation: This project serves as a way to implement the fly-in app navigation seen in apps like Facebook, Evernote, and Prixing.
- Cyril Mottierによる実装についての議論も,読んで損はない.
- Prixingアプリ: https://play.google.com/store/apps/details?id=fr.epicdream.beamy
将来性
私が思うに,これはAndroid UIデザインの優れた一歩だろう.実装をばらばらにやりすぎて,ゴミの山を量産してしまわないように気をつけるべきだ.ユーザに混乱を招くからだ.
Google I/O が近いし,次のAndroidのアナウンスもあるだろう.GoogleがこのややこしいコンポーネントをOSに組み込んでくれるといいが(HoneyCombでアクションバーを取り入れたように).そうなれば実装に一貫性が出てくる.
要約
- Side Navigationいいね!
- まちがったデザインに陥らないよう注意が必要
- 戻るスタック,ジェスチャ,「上へ」との関係,見た目,これらに注意
■
最近買った本のリスト.
Android Security 安全なアプリケーションを作成するために
- 作者: タオソフトウェア株式会社
- 出版社/メーカー: インプレス
- 発売日: 2011/12/29
- メディア: 大型本
- 購入: 6人 クリック: 141回
- この商品を含むブログ (27件) を見る
CoffeeScriptファーストガイド モダンJavaScriptによるアプリケーション開発 (NEXT-ONE)
- 作者: 飯塚直
- 出版社/メーカー: 翔泳社
- 発売日: 2012/05/26
- メディア: 大型本
- クリック: 49回
- この商品を含むブログ (6件) を見る
- 作者: 大塚弘記,渡辺修司,堤智代,森田創,中島聡,A-Listers,はまちや2,川添貴生,井上誠一郎,近藤宇智朗,ヒノケン,後藤秀宣,佐藤鉄平,mala,奥野幹也,伊藤智章,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2012/06/23
- メディア: 大型本
- 購入: 13人 クリック: 143回
- この商品を含むブログ (18件) を見る
■
最近買った本のリスト。
- 作者: 名村卓,三宅陽一郎,白土慧,勝間亮,石田忠司,牧本慎平,A-Listers,近藤宇智朗,はまちや2,mala,じゅんいち☆かとう,並河祐貴,小野修司,中島聡,森田創,小飼弾,田籠聡,天野祐介,cho45,大和田純,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2012/04/24
- メディア: 大型本
- 購入: 4人 クリック: 189回
- この商品を含むブログ (10件) を見る
Android Layout Cookbook アプリの価値を高める開発テクニック
- 作者: あんざいゆき
- 出版社/メーカー: インプレス
- 発売日: 2011/03/11
- メディア: 単行本(ソフトカバー)
- 購入: 9人 クリック: 147回
- この商品を含むブログ (33件) を見る
Android UI Cookbook for 4.0 ICS(Ice Cream Sandwich)アプリ開発術
- 作者: あんざいゆき
- 出版社/メーカー: インプレス
- 発売日: 2012/03/16
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 47回
- この商品を含むブログ (18件) を見る
いまAndroidではやりのアプリDashboardの作成については,上掲書のほか,下記の記事が参考になりました.
http://www.androidhive.info/2011/12/android-dashboard-design-tutorial/
ただし,各レイアウトの評価値を算出する際に用いる係数UNEVEN_GRID_PENALTY_MULTIPLIER は,1(ペナルティなし)が妥当だと思います.
■
最近買った本のリスト.
- 作者: ビープラウド
- 出版社/メーカー: 秀和システム
- 発売日: 2012/03/26
- メディア: 単行本
- 購入: 6人 クリック: 765回
- この商品を含むブログ (27件) を見る
Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)
- 作者: 大竹智也
- 出版社/メーカー: 技術評論社
- 発売日: 2012/03/07
- メディア: 単行本(ソフトカバー)
- 購入: 22人 クリック: 396回
- この商品を含むブログ (1件) を見る
JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
- 作者: Douglas Crockford,水野貴明
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/12/22
- メディア: 大型本
- 購入: 94人 クリック: 1,643回
- この商品を含むブログ (190件) を見る
The RSpec Book (Professional Ruby Series)
- 作者: David Chelimsky,Dave Astels,Zach Dennis,角谷 信太郎,豊田 祐司,株式会社クイープ
- 出版社/メーカー: 翔泳社
- 発売日: 2012/02/22
- メディア: 大型本
- 購入: 7人 クリック: 141回
- この商品を含むブログ (19件) を見る
- 作者: 小川明彦,阪井誠
- 出版社/メーカー: 翔泳社
- 発売日: 2010/10/13
- メディア: 大型本
- 購入: 16人 クリック: 337回
- この商品を含むブログ (52件) を見る
すでに各所でご指摘のとおり,*Pythonプロフェッショナルプログラミング*はPythonを書く用事が特にないかたにもおすすめ.なんたってPythonはスクリプト言語でもありますからね.治具を作るにはうってつけなのです.私はこれでSphinx-Users.jp — Python製ドキュメンテーションビルダー、Sphinxの日本ユーザ会を覚えました.他にも開発のための教科書となるようなことがらがいっぱいです.
でも,1行Webサーバは SimpleHTTPServerではなくWEBrickを使っているし,Sphinxからmake htmlする際にはwatchrを使っています.
■
最近買った本のリスト.
Linuxエンジニア養成読本 [仕事で使うための必須知識&ノウハウ満載!] (Software Design plus)
- 作者: SoftwareDesign編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2011/04/08
- メディア: 大型本
- 購入: 14人 クリック: 190回
- この商品を含むブログ (24件) を見る
プロダクティブ・プログラマ -プログラマのための生産性向上術 (THEORY/IN/PRACTICE)
- 作者: Neal Ford,島田浩二(監訳),夏目大
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/04/27
- メディア: 単行本(ソフトカバー)
- 購入: 14人 クリック: 242回
- この商品を含むブログ (101件) を見る
- 作者: Robin Williams,吉川典秀
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2008/11/19
- メディア: 単行本(ソフトカバー)
- 購入: 58人 クリック: 1,019回
- この商品を含むブログ (102件) を見る
- 作者: 渡邊昌之
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2011/08/26
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 5回
- この商品を含むブログ (5件) を見る
- 作者: ポール・M・デュバル,スティーブ・M・マティアス,アンドリュー・グローバー,大塚庸史,丸山大輔,岡本裕二,亀村圭助
- 出版社/メーカー: 日経BP社
- 発売日: 2009/08/06
- メディア: 単行本
- 購入: 18人 クリック: 388回
- この商品を含むブログ (37件) を見る
`gem install activerecord-postgresql-adapter`はproduction用にGemfileを切る
herokuにRails3.2.1アプリをpushしようとすると,
adapter: `gem install activerecord-postgresql-adapter` (pg is not part of the bundle. Add it to Gemfile.) (RuntimeError)
が出てうまくいかない.
ここにはいくつもの罠がある.
- "activerecord-postgresql-adapter"というgemは存在しない.gem install pgでないとだめ.(参考:RailsからPostgreSQLに繋がらない〜 - Stellaqua - TOMの技術日記)
- ふつうにgem installすると失敗する.--with-pg-dirでPostgresのインストールしてあるディレクトリを指定する必要がある.(参考:libpq-fe.hが見つからない - 屑プログラマの憂鬱)
- 上記のことはすべて関係なく,Gemfileの記述を以下のように変えないとダメ.
group :production do gem 'pg' end group :development, :test do gem 'sqlite3' end
(参考:HerokuでRails 3.1.3 でdeployするまで - リンゴの水やり?(はてな))
このように書きかえて,
$ bundle install --without production
をしてはじめて成功する.
行列を素早く作るにはEnumeratorをmapする
技術記事の棚卸をしていて,こちらの記事で勉強していたのですが,
[Ruby] 10行で書ける Dijkstra 法 | singular point
行列を作る手段としてこちらが使われていました。
n=6 g=n.times.collect{ Array.new(n,-1)}
collectメソッドを使い慣れていなくて(ずっとmap),一瞬なんだかわからなかったのですが,これは
pry(main)> g = n.times.map{ Array.new(n, -1) } #=> [[-1, -1, -1, -1, -1, -1], # [-1, -1, -1, -1, -1, -1], # [-1, -1, -1, -1, -1, -1], # [-1, -1, -1, -1, -1, -1], # [-1, -1, -1, -1, -1, -1], # [-1, -1, -1, -1, -1, -1]]
と同じコードです.timesメソッドがEnumeratorを返すのでこれをmapすることで配列の配列を生成しているんですね.
Class: Integer (Ruby 1.9.3)