68
"あんざいゆき" x "秋葉ちひろ" は カンファレンスアプリをどう作るのか? 2014.04.18 主催:インプレスジャパン

"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

Embed Size (px)

DESCRIPTION

2014年4月18日開催のAndroidアプリ制作者のための開発&デザインセミナー http://www.impressjapan.jp/items/android-20140418 のスライドです。

Citation preview

Page 1: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

"あんざいゆき" x "秋葉ちひろ" は カンファレンスアプリをどう作るのか?

2014.04.18 主催:インプレスジャパン

Page 2: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

株式会社ウフィカ 代表取締役

あんざいゆき

blog : Y.A.Mの雑記帳(y-anz.m.blogspot.com)

twitter : @yanzm (やんざむ)

GTUG Girls マネージャー

Page 3: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

秋葉ちひろ株式会社ツクロア 取締役 デザイナー

Webサイト/スマホアプリ/ハードウェアなど、プラットフォームの垣根なく、デザイン全般のクリエイティブワークに携わる。 !構造や仕様もデザイナーから提案できないといけないと考えている。

Page 4: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

前半デザイン&設計

Page 5: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

新しいアプリを作るステップ

1. 既存アプリの調査 2. ざっくり機能を考える 3. 構成(画面遷移)を考える 4. 各画面のレイアウトを考える 5. 実装する 6. 使ってみる

Page 6: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

•どういう機能があるか •どういう構成(画面遷移)になっているか •こういう機能もあればいいのになぁ

1. 既存アプリの調査 2.ざっくり機能を考える

「必要な機能がみえてくる」

Page 7: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. 既存アプリの調査 2.ざっくり機能を考える

チェックしたアプリ

•ABC 2014 Spring 関連のアプリ •ABC 2013 Autumn 関連のアプリ •Google I/O アプリ •Google Playで「Conference」で検索した結果からよさげなもの

Page 8: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. 既存アプリの調査 2.ざっくり機能を考える

要求レベル

•公式サイトにいきたい •講演内容がしりたい •見るスケジュールを作りたい •お気に入りとしてチェックしたい •地図が見たい

3.構成(画面遷移)を考える

Page 9: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. 既存アプリの調査 2.ざっくり機能を考える

シナリオを考える(想像する)

1つの時間帯では1つの講演しか見れない

タイムテーブルがほしい

「同じ時間帯の講演から、

 どれ見ようかなぁって考えるよね」

3.構成(画面遷移)を考える

Page 10: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. 既存アプリの調査 2.ざっくり機能を考える

タイムテーブルの要求

•タイムテーブルの項目をタップしたら講演の詳細がみたい •どれがお気に入りになっているか知りたい •どの部屋の講演か知りたい

3.構成(画面遷移)を考える

Page 11: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. 既存アプリの調査 2.ざっくり機能を考える

講演詳細の要求

•タイトル、講演者、概要、時間、部屋、カテゴリが知りたい •カテゴリをタップしたら、そのカテゴリの講演一覧が見たい •講演部屋の地図がみたい •お気に入りにチェックしたい

3.構成(画面遷移)を考える

Page 12: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. 既存アプリの調査 2.ざっくり機能を考える

シナリオを考える2(想像する)

バザールの見せ方って難しい

「地図がないとつらい、常にみたい」

「ブースの数が多いので、地図のどこ にあるかすぐ見つけられるように なっててほしい」

3.構成(画面遷移)を考える

Page 13: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. 既存アプリの調査 2.ざっくり機能を考える

ABC 2013 Autumn の地図

3.構成(画面遷移)を考える

Page 14: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. 既存アプリの調査 2.ざっくり機能を考える

ABC 2014 Spring の地図

•色分けわかりやすい •「あ、い、う、え、か」も別の色がいい

3.構成(画面遷移)を考える

Page 15: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

•どの島のブースがすぐわかりたい - 色分けの色を表示するとか •ブースがたくんさんあるから下まで行くのたいへん - インデックスラベル + fast scroll - ヘッダーが残るリスト

1. 既存アプリの調査 2.ざっくり機能を考える

バザール一覧の要求

3.構成(画面遷移)を考える

Page 16: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. 既存アプリの調査 2.ざっくり機能を考える

バザール詳細の要求

•地図と一緒にみたい - 地図をみるときにブース番号を覚えておかないといけないのは嫌

•どの島のブースがすぐわかりたい - 色分けの色を背景にするとか •隣のブースの詳細に簡単に移動したい(ある島を流れ歩きでぐるっと見て回るときとか)

3.構成(画面遷移)を考える

Page 17: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

•それを見て行動するからスケジュールっぽくなっているのがいい - 時間順に講演が並ぶ - 地図が常にでている

1. 既存アプリの調査 2.ざっくり機能を考える

お気に入りの要求

3.構成(画面遷移)を考える

Page 18: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

•タイムテーブル •お気に入り(マイスケジュール) •カンファレンス一覧(カテゴリごと) •バザール一覧 •公式サイト

2.ざっくり機能を考える 3.構成(画面遷移)を考える

トップレベルの画面

4.各画面のレイアウトを考える

Page 19: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

•トップレベル画面が4つ以上ある •トップレベル画面でスワイプによる 画面きりかえを使いたい

2.ざっくり機能を考える 3.構成(画面遷移)を考える

トップレベルの構成

4.各画面のレイアウトを考える

Navigation Drawer

Page 20: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.ざっくり機能を考える 3.構成(画面遷移)を考える

タイムテーブル

4.各画面のレイアウトを考える

Page 21: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
Page 22: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
Page 23: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

•スマホの1画面におさめるのは難しい

2.ざっくり機能を考える 3.構成(画面遷移)を考える

タイムテーブル

4.各画面のレイアウトを考える

特定の時間枠ごとにどれを見るか考えるなら、時間枠ごとに1画面にするのはどうか

➡横軸を時間にする ➡スワイプで隣の時間枠に移動

Page 24: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

特定の時間枠のタイムテーブル

2.ざっくり機能を考える 3.構成(画面遷移)を考える

タイムテーブルの画面遷移

4.各画面のレイアウトを考える

隣の時間枠のタイムテーブルスワイプ

講演詳細項目タップ

Page 25: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

特定の講演の情報

2.ざっくり機能を考える 3.構成(画面遷移)を考える

講演詳細の画面遷移

4.各画面のレイアウトを考える

地図地図アイコンタップ

そのカテゴリの講演一覧カテゴリタップ

Page 26: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

カテゴリの一覧

2.ざっくり機能を考える 3.構成(画面遷移)を考える

カンファレンス一覧の画面遷移

4.各画面のレイアウトを考える

そのカテゴリの講演一覧特定のカテゴリをタップ

講演詳細特定の講演をタップ

Page 27: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

バザールの一覧

2.ざっくり機能を考える 3.構成(画面遷移)を考える

バザールの画面遷移

4.各画面のレイアウトを考える

バザール詳細特定のバザールを タップ

隣のバザール詳細スワイプ

Page 28: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

カテゴリの一覧

2.ざっくり機能を考える 3.構成(画面遷移)を考える

お気に入り(マイスケジュール)の画面遷移

4.各画面のレイアウトを考える

講演詳細お気に入りのカンファレンス一覧

バザール詳細お気に入りのバザール一覧

Page 29: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

•メインの色を決める •タイムテーブル •詳細 •お気に入り •バザール •マイスケジュール

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

Page 30: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

•白ベースでスッキリ見やすく •うすいグレーをサブカラー •アクセントカラー2つ

メインの色を決める

メイン サブ アクセント

Page 31: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

•ActionBarのタブではなくViewPagerTabStrip •文字のジャンプ率と色で、情報の優劣をつける

タイムテーブル

Page 32: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

•ヘッダで領域をとらないように •文字がかぶらないように

詳細画面

Page 33: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

Page 34: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

•アイコンだけだとわかりづらい •マイスケジュールに登録するボタンの動き •「マイスケジュールに追加」 「~登録済み」という文言の吟味

お気に入り

Page 35: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

Page 36: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

•それぞれの場所の印象が強くなるようなデザインに

バザール

色を全面に押し出す

Page 37: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

Page 38: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

•1画面で見れるように、2列で考えていたが、さすがに入りきらなかったw

マイスケジュール

Page 39: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.各画面のレイアウトを考える 5.実装する3.構成(画面遷移)を考える

Page 40: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

後半実装

Page 41: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

ABC 2014 Spring のデータhttp://www.android-group.jp/conference/abc2014s/api/

Page 42: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

ContentProvider設計

• id : integer primary key

• title : text

• abstract : text

• speakers : text(speaker

idを;で結合)

• start_time : long

• end_time : long

カンファレンス

• room_id : integer

• room : text

• category_id : integer

• category : text

• time_frame : integer

Page 43: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

ContentProvider設計

• id : integer primary key

• name : text

• profile : text

スピーカー

Page 44: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

ContentProvider設計

• id : integer primary key

• group : text

• title : text

• content : text

バザール

• location_area : text

• location_area_id : integer

• location_number:

• location_number_id : integer

Page 45: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

MainActivity

0. Activityの構成 1.

Page 46: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

ConferenceListActivity

0. Activityの構成 1.

Page 47: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

ConferenceDetailActivity

0. Activityの構成 1.

Page 48: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

BazaarDetailActivity

0. Activityの構成 1.

Page 49: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

0. Activityの構成 1.

Page 50: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. タイムテーブル 2.

タイムテーブル

•ViewPager •PagerTabStrip •ListFragment •複数のCursorを持つAdapter

Page 51: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. タイムテーブル 2.

各部屋が1つのCursor

Page 52: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. タイムテーブル 2.

•複数のCursorを持つAdapter •ヘッダーの表示も対応している •http://goo.gl/Dp033b

CompositeCursorAdapter

Page 53: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

カテゴリー一覧

•ListFragment •SimpleCursorAdapter •カテゴリー名(カテゴリーID)のCursorを作る

Page 54: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

カテゴリー一覧

•カテゴリーIDの重複していないCursor

•group By を使う

Page 55: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

Content Provider で group By を使う

Uri.Builder builder = DataProvider.SESSION_URI.buildUpon();builder.appendQueryParameter("groupBy", DataProvider.SessionColumn.COLUMN_CATEGORY_ID);Uri uri = builder.build();

@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {! String groupBy = uri.getQueryParameter("groupBy");! SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); ... Cursor c = qb.query(db, projection, selection, selectionArgs, groupBy, null, orderBy);

Page 56: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

カテゴリー一覧

•SimpleCursorAdapterには “_id” カラムが必要 •group By したカテゴリーIDを as を使って “_id” として取得

Page 57: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

as を使って “_id” として取得

String[] projection = { DataProvider.SessionColumn.COLUMN_CATEGORY_ID + " as " + DataProvider.SessionColumn._ID, DataProvider.SessionColumn.COLUMN_CATEGORY};!return new CursorLoader(getActivity(), uri, projection, null, null, null);

Page 58: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

カテゴリー一覧

•全てのトラックを表示するための行もほしい •MergeCursor を使って Cursor を合体 •全てのトラック用の Cursor は MatrixCursor で用意

Page 59: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

MergeCursor で Cursor を合体

@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor c) { MatrixCursor all = new MatrixCursor(new String[]{ DataProvider.SessionColumn._ID, DataProvider.SessionColumn.COLUMN_CATEGORY});! // CATEGORY_ID は 1 からなので、全トラック用に 0 を使う all.addRow(new Object[]{0, getString(R.string.all_track)}); mAdapter.swapCursor(new MergeCursor(new Cursor[]{all, c}));}

Page 60: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

カンファレンス一覧

•ListFragment •SimpleCursorAdapter •カンファレンスのテーブルにはスピーカーID •スピーカー名は別テーブル

Page 61: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

カンファレンス一覧

•カンファレンスのテーブルにはスピーカーのIDが ; 区切りで入っている •スピーカー名に変換したカラムもCursorに欲しい •CursorWrapperを使う

Page 62: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

CursorWrapper を作る

@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor c) { mAdapter.swapCursor(SpeakerCursorWrapper.wrap(c, getActivity()));}

SpeakerCursorWrapperの実際のコードのデモ

Page 63: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

カンファレンス詳細

•ListFragment •ヘッダー •カンファレンス情報 •リスト本体 •スピーカー •お気に入りボタン

Page 64: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

2.カンファレンス 3.バザール1.タイムテーブル

お気に入りボタン

•FrameLayoutを継承したCustomView •ToggleButtonと★を重ねたレイアウト •Checkableを実装しToggleButtonに流す •ONでアニメーション

Page 65: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

3.バザール 4.2.

バザール一覧

•ListFragment •各島が1つのCursor •複数のCursorを持つAdapter •FastScroll + インデックスラベル •ヘッダーの残るリスト

Page 66: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

1. タイムテーブル 2.

•もともとヘッダーの表示に対応している •ヘッダーの情報を使ってインデックスラベルを作成 •ヘッダーの残るリストに対応

CompositeCursorAdapterを改造

Page 67: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

4.マイスケジュール3.

マイスケジュール

•ViewPager •PagerTabStrip •Fragment + ListView

Page 68: "あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?

トークセッション