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
470
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.5k
Other Decks in Programming
See All in Programming
ECR拡張スキャンでSBOMを収集して サプライチェーン攻撃の影響調査を 爆速で終わらせてみた
akihisaikeda
2
210
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.1k
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
2
470
3Dシーンの圧縮
fadis
1
520
CLIであることを活かしたGitHub Copilot CLI活用術 / GitHub Copilot CLI Pro Tips & Tricks
nao_mk2
1
1.1k
1人1案件のプロダクトエンジニア時代に、"プロセス監督"としてチャレンジしたこと
non0113
0
350
Oxcを導入して開発体験が向上した話
yug1224
4
260
Oxlintのカスタムルールの現況
syumai
5
900
CSC307 Lecture 17
javiergs
PRO
0
280
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
220
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
410
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
1.3k
Featured
See All Featured
Unsuck your backbone
ammeep
672
58k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
370
4 Signs Your Business is Dying
shpigford
187
22k
Optimizing for Happiness
mojombo
378
71k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
520
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
240
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
330
The World Runs on Bad Software
bkeepers
PRO
72
12k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
How to build a perfect <img>
jonoalderson
1
5.5k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
190
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を使えばさらに最適化できそう • 少しでも私たちの取り組みがヒントになれば嬉しいです • より良い知見があれば、ぜひ教えていただけると助かります
最後に
ご清聴ありがとうございました