Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マッチングアプリにおけるフリックUIで苦労したこと
Search
yuhei
July 10, 2025
Programming
460
0
Share
マッチングアプリにおけるフリックUIで苦労したこと
CA.Flutter #4 で登壇した資料です。
https://cyberagent.connpass.com/event/358111
yuhei
July 10, 2025
More Decks by yuhei
See All by yuhei
StoreKit2を使った課金システムのフルリニューアル
yuheiito
2
5.4k
Other Decks in Programming
See All in Programming
ソフトウェア設計の結合バランス #phperkaigi
kajitack
0
170
「話せることがない」を乗り越える 〜日常業務から登壇テーマをつくる思考法〜
shoheimitani
4
940
AIベース静的検査器の偽陽性率を抑える工夫3選
orgachem
PRO
4
380
Making the RBS Parser Faster
soutaro
0
640
Don't Prompt Harder, Structure Better
kitasuke
0
800
Running Swift without an OS
kishikawakatsumi
0
870
AI時代のPhpStorm最新事情 #phpcon_odawara
yusuke
0
240
From Formal Specification to Property Based Test
ohbarye
0
620
アクセシビリティ試験の"その後"を仕組み化する
yuuumiravy
1
180
Cache-moi si tu peux : patterns et pièges du cache en production - Devoxx France 2026 - Conférence
slecache
0
320
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
matsuo_atsushi
0
120
Back to the roots of date
jinroq
0
610
Featured
See All Featured
It's Worth the Effort
3n
188
29k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
140
How to Ace a Technical Interview
jacobian
281
24k
So, you think you're a good person
axbom
PRO
2
2k
The browser strikes back
jonoalderson
0
1k
Scaling GitHub
holman
464
140k
What's in a price? How to price your products and services
michaelherold
247
13k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
410
Mind Mapping
helmedeiros
PRO
1
180
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
Technical Leadership for Architectural Decision Making
baasie
3
350
Transcript
マッチングアプリにおける フリックUIで苦労したこと 2025/7/9 CA.Flutter #4
自己紹介 伊藤 悠平 • 株式会社CAMに中途入社 • iOSエンジニア5年、Flutterエンジニア3年目 • 2022年から株式会社タップルにジョインし、 課金リニューアルを担当
• 2023年からタップル発の 新規サービス「Koigram」に従事 • 米国株にはまってます ChatGPTに相談しながら
Koigramについて 「無料でも本気の恋はできる」をコ ンセプトにしたマッチングアプリで、 マッチもチャットも全員無料で利用 できます
• マッチングアプリにおけるフリック UIとは? • フリックとスクロール判定 • 画像ロードの工夫 主な内容
マッチングアプリにおける フリックUIとは?
マッチングアプリにおけるフリック UIとは? 左スワイプで「スキップ」
マッチングアプリにおけるフリック UIとは? 右スワイプで「いいね」
マッチングアプリにおけるフリック UIとは? 左右スワイプで「いいね/スキップ」 ChatGPTに - この図を添付 - テキストによるアルゴリズムの説明
マッチングアプリにおけるフリック UIとは? 苦労したこと 1 - 縦スクロールとの競合 縦スクロール? or 左右のスワイプ?
マッチングアプリにおけるフリック UIとは? 苦労したこと 2 - 素早い連続フリックにも耐える UI • 常にカードが表示される(何百件でも捌ける) •
常にメイン画像( 1枚目)が表示される • ネットワークが悪くてもメイン画像が表示される • 目標は1秒間に5件フリック
フリックとスクロール判定
フリックとスクロール判定 主なWidget 親Widget FlickCardsView 子Widget UserDetailView └─ SingleChildScrollView
フリックとスクロール判定 それぞれの Gesture 親Widget GestureDetector 子Widget RawGestureDetector
フリックとスクロール判定 それぞれの Gesture 子Widgetのスクロール操作より先に タッチイベントを受け取るために RawGestureDetectorを利用する
フリックとスクロール判定 親Widget - GestureDetector 親Widget GestureDetector - スキップ or いいね
のフリック判定 - 回転角度、フリック速度の計測 ※ここでは子Widgetを気にせずに実装
フリックとスクロール判定 子Widget - RawGestureDetector 子Widget RawGestureDetector - スクロールを有効にするかどうかを判定 - スワイプの角度、x/yの移動量を計測
スクロール制御の仕組み SingleChildScrollViewのphysicsを NeverScrollableScrollPhysics(スクロール無効) に切 り替えることで、親Widget側のGestureを優先させるよう にした
フリックとスクロール判定 子Widget - RawGestureDetector つまり、Gestureの状態は まず、子 WidgetのRawGestureDetectorでスワイプ方向を判定 └─ 縦方向と判定 →
physics = null(スクロール優先) └─ 横方向(フリック)と判定 → physics = NeverScrollableScrollPhysics(スクロール無効) └─ スクロールが無効状態なので、フリック操作が親 Widgetに伝わる 親Widget(GestureDetector)で 「いいね/スキップ」の処理を実行
画像ロードの工夫
画像ロードの工夫 ユーザーによる アップロード画像 様々な状況で検証した結果 ... - 最大解像度 1024 x 1024
- 最大ファイルサイズ 1MB(jpg) - Firebase Remote Configで、それぞれの値を変更できるようにした
画像ロードの工夫 連続フリックの要件 連続でフリックしても 常にメイン画像( 1枚目)が表示される
画像ロードの工夫 要件に答えられなかった ... • アップロードした画像そのままでは、連続フリックに耐えられなかった • ネットワークが悪いと、さらに処理が詰まりやすかった
画像ロードの工夫 解決策1 CachedNetworkImage • WebP + quality:60 で軽量な画像をロード (データURIスキーム) sharp:
https://sharp.pixelplumbing.com/api-resize/#resize • qualityはFirebase Remote Configで変更可能 • デバッグの計測結果を ChatGPTに渡して比較・検討し、設定を決定
画像ロードの工夫 解決策2 ロードすべき画像の優先順位 • ユーザー30件を取得後、まずメイン画像のみを優先ロード • メイン画像完了後に、先頭 2ユーザー分のサブ画像(最大 10枚)を段階ロード •
15件フリック時点で、次の 15件のユーザー情報を追加取得 • デバッグの計測結果を ChatGPTに渡して比較・検討し、設定を決定
画像ロードの工夫 解決策3 BaseCacheManagerによるStreamの監視 • ネットワークが悪いと画像のロードが詰まっていた • フリック済みユーザーの画像は不要なため、 ロード待ちの画像を即キャンセル可能に • iOSのデベロッパ機能にあるネットワークリンク調節器を
使って気がつき導入した
• ここにたどり着くまで、かなり試行錯誤を重ねた • 画像のロードなど、 Claude Codeを使えばさらに最適化できそう • 少しでも私たちの取り組みがヒントになれば嬉しいです • より良い知見があれば、ぜひ教えていただけると助かります
最後に
ご清聴ありがとうございました