Slide 1

Slide 1 text

Grid表⽰のレイアウトで Flow layoutsを使う Mobile勉強会 ウォンテッドリー × チームラボ × Sansan #18 〜新技術の導⼊〜 @cffYoHa

Slide 2

Slide 2 text

⾃⼰紹介 ● @cffYoHa(ようは) ● Fenrir Inc. ○ Android エンジニア ● DroidKaigi Staff

Slide 3

Slide 3 text

実現したいレイアウト ● スタンプラリー台紙のようなレイアウト

Slide 4

Slide 4 text

実現したいレイアウト ● スタンプラリー台紙のようなレイアウト ○ 左から右下に向かって敷き詰める

Slide 5

Slide 5 text

実現したいレイアウト ● スタンプラリー台紙のようなレイアウト ○ 左から右下に向かって敷き詰める ○ 各アイテムの台紙部分の形は固定

Slide 6

Slide 6 text

実現したいレイアウト ● スタンプラリー台紙のようなレイアウト ○ 左から右下に向かって敷き詰める ○ 各アイテムの台紙部分の形は固定 ○ スクロール可能な画⾯のUI要素として追加

Slide 7

Slide 7 text

なぜ話すのか ● 格⼦のレイアウトはLazy gridsが最適だと決めつけていた ● Grid表⽰の定番の選択肢であるLazy gridsではうまくいかなかった

Slide 8

Slide 8 text

LazyVerticalGridで実装してみる

Slide 9

Slide 9 text

LazyVerticalGridで実装してみる 右端に余分なスペースが残ってしまう

Slide 10

Slide 10 text

そもそも ● 親要素のLazyColumnとネストが発⽣しているから󰢃 ● ビルドせずにUIを作り続けたせいで気づくのに遅れた。。。

Slide 11

Slide 11 text

Flow layoutsを使う ● 特徴 ○ コンテナのスペースが不⾜すると アイテムが次の⾏に流れ込む ○ チップやフィルタリング UIに最適 ○ 100個未満の少量のアイテムに最適 ● 注意点 ○ 現時点ではExperimental https://developer.android.com/develop/ui/compose/layouts/flow

Slide 12

Slide 12 text

FlowRowで実装

Slide 13

Slide 13 text

FlowRowで実装

Slide 14

Slide 14 text

FlowRowで実装 🥳

Slide 15

Slide 15 text

Flow layoutsを使う ● 特徴 ○ コンテナのスペースが不⾜すると アイテムが次の⾏に流れ込む ○ チップやフィルタリング UIに最適 ○ 100個未満の少量のアイテムに最適 ● 注意点 ○ 現時点ではExperimental https://developer.android.com/develop/ui/compose/layouts/flow

Slide 16

Slide 16 text

Flow layoutsを使う ● 特徴 ○ コンテナのスペースが不⾜すると アイテムが次の⾏に流れ込む ○ チップやフィルタリング UIに最適 ○ 100個未満の少量のアイテムに最適 ● 注意点 ○ 現時点ではExperimental https://developer.android.com/develop/ui/compose/layouts/flow

Slide 17

Slide 17 text

振り返る ● FlowRowおよびFlowColumnは、100個未満の少量のアイテムに最適 FlowRow and FlowColumn is perfect for a small number of items, less than 100 items. https://developer.android.com/jetpack/androidx/releases/compose-foundation

Slide 18

Slide 18 text

振り返る ● FlowRowおよびFlowColumnは、100個未満の少量のアイテムに最適 FlowRow and FlowColumn is perfect for a small number of items, less than 100 items. https://developer.android.com/jetpack/androidx/releases/compose-foundation 🤔 アイテム数が 多いとき‧‧

Slide 19

Slide 19 text

遅延読み込みに対応した flow itemsを使う ● ContextualFlowRow /Column ○ androidx.compose.foundation:foundation-*:1.7.0 以上が必要

Slide 20

Slide 20 text

引数を観察してみる ● maxLines ○ 表⽰⾏数を制限 ● overflow ○ itemがoverflow時に表⽰する内容を指定 ■ Clip : デフォルト値 maxLinesを超えたものは⾮表⽰ ■ Visible : maxLinesを超えていてもすべて表⽰ ■ ExpandIndicator : 追加でアイテムを読み込むインジケーターやボタンを表⽰ ■ ExpandOrCollapseIndicator : ExpandIndicator に「折りたたむ」オプションが追加

Slide 21

Slide 21 text

使おうとしたところ‧‧‧ https://android-review.googlesource.com/c/platform/frameworks/support/+/3409998

Slide 22

Slide 22 text

遅延読み込みに対応した flow itemsを使う ● ContextualFlowRow /Column ○ androidx.compose.foundation:foundation-*:1.7.0 以上が必要

Slide 23

Slide 23 text

内容の抜粋 ● ContextualFlowRow/Column ○ 1.7で導⼊したがまだ安定化しておらず、実装が望ましくないため、Deprecated ● FlowRow/Column ○ 1.7でoverflow を引数に含むExperimentalなFlowRow/Columnを導⼊したがこれを Deprecatedとする ○ 引数にoverflow を含まないFlowRow/Columnを今後は利⽤可能 ■ overflowはデフォルト値のClipが適⽤される

Slide 24

Slide 24 text

引数にoverflow を含まないFlowRow https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt

Slide 25

Slide 25 text

内容の抜粋 ● ContextualFlowRow/Column ○ 1.7で導⼊したがまだ安定化しておらず、実装が望ましくないため、Deprecated ● FlowRow/Column ○ 1.7でoverflow を引数に含むExperimentalなFlowRow/Columnを導⼊したがこれを Deprecatedとする ○ 引数にoverflow を含まないFlowRow/Columnを今後は利⽤可能 ■ overflowはデフォルト値のClipが適⽤される ● 今後 ○ ContextualFlowRow/Columnの多くのユースケースはFlowRow/Columnで実現可能 ○ 完全に代替可能でもないため、それらのケースを別の⽅法で解決することも模索中

Slide 26

Slide 26 text

まとめ ● 親ViewがScrollableなレイアウトにおいて、Grid表⽰を実装する際は Flow layoutsを試してみると良さそう ● ContextualFlowRow/Columnの多くのユースケースは FlowRow/Columnで実現可能なため、FlowRow/Columnを利⽤しよう ● 遅延読み込みを実装したい場合は今後に期待

Slide 27

Slide 27 text

参考 ● https://developer.android.com/develop/ui/compose/lists ● https://developer.android.com/develop/ui/compose/layouts/flow ● https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/package-summary.html ● https://android-review.googlesource.com/c/platform/frameworks/support/+/3409998 ● https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/foundation/found ation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/FlowLayout.kt