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
Book Reader Implementation Notes with Android V...
Search
FUJI Goro
April 16, 2016
Technology
0
2.4k
Book Reader Implementation Notes with Android ViewPager 2016
https://github.com/gfx/TinyPdfReader
の解説です。
FUJI Goro
April 16, 2016
Tweet
Share
More Decks by FUJI Goro
See All by FUJI Goro
How to Boost Your Code with WebAssembly
gfx
2
2.9k
AssemblyScriptでライブラリコードの高速化をしてみる
gfx
5
3.1k
実践TypeScriptトークバトル
gfx
1
1.1k
歴史的経緯の説明 as code
gfx
7
2.8k
Elasticsearchによる 全文検索の実装 in Rails
gfx
6
9.4k
すばらしきGraphQLのSEKAIへようこそ
gfx
20
9.3k
マルチテナント・ウェブアプリケーションの実践
gfx
14
9.5k
How to choose the ORM on Android
gfx
1
4.2k
How Do We Get Along With Static Types
gfx
5
3.3k
Other Decks in Technology
See All in Technology
RayでPHPのデバッグをちょっと快適にする
muno92
PRO
0
190
エンジニアが加速させるプロダクトディスカバリー 〜最速で価値ある機能を見つける方法〜 / product discovery accelerated by engineers
rince
4
550
ディスプレイ広告(Yahoo!広告・LINE広告)におけるバックエンド開発
lycorptech_jp
PRO
0
280
役員・マネージャー・著者・エンジニアそれぞれの立場から見たAWS認定資格
nrinetcom
PRO
3
5.4k
1行のコードから社会課題の解決へ: EMの探究、事業・技術・組織を紡ぐ実践知 / EM Conf 2025
9ma3r
8
3.3k
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.3k
NFV基盤のOpenStack更新 ~9世代バージョンアップへの挑戦~
vtj
0
340
スキルだけでは満たせない、 “組織全体に”なじむオンボーディング/Onboarding that fits “throughout the organization” and cannot be satisfied by skills alone
bitkey
0
160
Active Directory攻防
cryptopeg
PRO
8
5.3k
「正しく」失敗できる チームの作り方 〜リアルな事例から紐解く失敗を恐れない組織とは〜 / A team that can fail correctly
i35_267
4
780
入門 PEAK Threat Hunting @SECCON
odorusatoshi
0
120
エンジニアリング価値を黒字化する バリューベース戦略を用いた 技術戦略策定の道のり
kzkmaeda
6
2.2k
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
100
18k
GitHub's CSS Performance
jonrohan
1030
460k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
It's Worth the Effort
3n
184
28k
Making Projects Easy
brettharned
116
6k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.4k
Navigating Team Friction
lara
183
15k
BBQ
matthewcrist
87
9.5k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Raft: Consensus for Rubyists
vanstee
137
6.8k
Transcript
ಡॻը໘࣮ͷࣄ݅ ~ Android ViewPagerฤ ~ 2016/4/15 ిࢠॻ੶ษڧձ FUJI Goro (gfx)
ࣗݾհ
ࢀর࣮ • ͜ͷࢿྉͷࢀর࣮ҎԼʹ͋Γ·͢ • https://github.com/gfx/TinyPdfReader • ίΞϩδοΫ200ߦ͘Β͍ • DeploygateͰAPKΛ৴͍ͯ͠·͢ •
https://dply.me/xntdx6
ViewPagerجૅࣝ • AOSPͷҰ෦ (support library) • εϫΠϓͰࠨӈʹҠಈ͢ΔViewGroup • λϒҰൠɺಡॻը໘ͳͲʹ͏ •
ϖʔδͷਐΉํLTR(left-to-right)
ϑΝΠϧ#1 ϖʔδૹΓ͕ͬ͞Γ͢Δ
ϖʔδૹΓ͕͍ • ʮBookʯʢࠓճPDFʣ͔Β1ϖʔδऔΓग़ ͯ͠bitmapΛੜ͢Δͷʹ100 ~ 300sec͔͔ Δ • ͯ͢UIεϨουͰॲཧ͢ΔͱɺϖʔδૹΓ Ͱʮࢦ͕Ҿ͔͔ͬΔʯײ͕͢͡Δ
ViewPagerͷ࣮ • ViewPagerɺʮݱࡏͷϖʔδʯͱʮલޙͷ ϖʔδʯͷ3ϖʔδͷviewΛߏங͢Δ • ʮ࣍ͷϖʔδʯʹҠಈ͢Δલʹͦͷ࣍ͷϖʔ δͷviewΛߏங͢ΔͷͰɺͦ͜ͰඦϛϦ͔ ͔ΔͱʮϖʔδૹΓ͕٧·ΔʯΑ͏ʹײ͡Δ
#1 ͷղܾ • ViewPagerʹҰ୴ۭͷviewΛ͠ɺbitmapੜ όοΫάϥϯυεϨουͰߦ͏ • bitmap͕ੜͰ͖ͨΒviewʹͯ͠ඳը͢ Δɺ͜ͷͱ͖alphaʢಁ໌ʣͰΞχϝʔ γϣϯͯ͠ʮ;Θͬͱʯදࣔ͞ΕΔΑ͏ʹ͢ Δͱࢹ֮తʹ༏ͯ͘͠Α͍
PdfPagerAdapter: 1ทͷॲཧ ϓϨʔεϗϧμ7JFXΛͭ͘Δ ඇಉظͰCJUNBQΛϩʔυ͢Δ ݟ։͖࣌ϖʔδϩʔυ
RenderBitmapTask: bitmapੜ ݟ։͖ରԠͷͨΊͪΐͬͱෳࡶ جຊ1EG3FOEFSFSSFOEFS ΛݺͿ͚ͩ
RenderBitmapTask ϑϨʔϜ͔ͭͬͯ;Θͬͱग़ݱͤ͞Δ
Ͳ͜·Ͱ࠷దԽ͖͔͢ • 3ϖʔδ (දࣔϖʔδ+લޙϖʔδʣͷʮ४උʯ͕1ϑ ϨʔϜ(16ms)ҎԼͳΒेߴ • 1ϑϨʔϜҎԼͰͷ࠷దԽઅిޮՌ͘Β͍ • bitmapੜ30msͱ300msͰUXʹͦΕ΄Ͳҧ͍ͳ͍ •
500msΛ͑ΔΑ͏ͳΒ࠷దԽ͖͚ͩ͢ͲɺͦΕҎ Լʹ͢Δྗ͋·Γҙຯ͕ͳ͍
File #2 طಡཧ͍ͨ͠
طಡཧ • ΞϓϦͷॻ੶͝ͱʹɺͲ͜·ͰಡΜ͔ͩه ͍ͨ͠ • ViewPager#getCurrentItem() ͰҐஔΛऔಘ • 1ը໘1ϖʔδͷ࣌؆୯ɺ1ը໘2ϖʔ δʢݟ։͖ʣͷͱ͖
• ʮॻ੶σʔλͰͷҐஔʯʹม͢Δඞཁ͕͋Δ
ʮҐஔʯʹؔ͢Δ໋໊نଇ • ໋໊نଇΛͭ͘Βͳ͍ͱࢮ͵ • ViewPagerͷݱࡏ: position • ॻ੶σʔλͰͷҐஔ: pageIndex •
Ϧϑϩʔͷ͜ͱߟ͑ͳ͍ͷͱ͢Δ
QPSUSBJUͷͱ͖ͦͷ·· JT1PSUSBJU ͡Όͳ͍ͱ͍͚ͳ͍ͷ 7JFX1BHFSͷόάͱࢥΘΕΔ MBOETDBQF ݟ։͖ ͷͱ͖ ഒͯ͠දࢴͷΛҾ͘ ਖ਼֬ʹٯͷมΛߦ͏ 7JFX1BHFSͷҐஔ͔Βॻ੶Ґஔʹม
ॻ੶Ґஔ͔Β7JFX1BHFSͷҐஔʹม
File #3 ViewPager͕ࢥ͍௨Γʹಈ͍ ͯ͘Εͳ͍ΜͰ͢…
VPΛӈ͔ΒࠨʹҠಈͤ͞Δ • ViewPagerleft-to-rightͳͷͰɺright-to-left ͷॻ੶Λදࣔ͢Δͱ͖ʹͦͷ··͏ͱࢮ͵ • …ͷͰRVPͱ͍͏ϥΠϒϥϦΛ࡞ͬͨ • https://github.com/gfx/ReversibleViewPager • rvp.setReversed(true)
͢Δ͚ͩʂ
ViewPagerͰϐϯνΠϯɾΞτ͢ ΔͱIllegalArgumentException • ViewPagerͷόάͬΆ͍ • https://code.google.com/p/android/issues/detail?id=64553 • ViewPager Λܧঝͯ͠ super.onInterceptTouchEvent()
ͷྫ֎ΛѲΓ௵ ͤʂ • RVP͜ͷରԠ͕ೖ͍ͬͯΔ
VP#onSavedInstanceState() • ը໘ճస࣌ʹঢ়ଶΛอଘ͢Δ࣌ʹݺΕΔ • configuration͔ΒͱΕΔorientation͕ʮݱࡏͷ σόΠεͷํʯͰͳ͘ʮ͜Ε͔Β͔͏ํʯ ʹͳΔ • ͦ͜Ͱલड़ͷ !isPortrait()
ʹͳͬͨ • ͜Εਖ਼͍͠ͷ͔…ಈ͍ͯΔ͚Ͳ…
VP#onCreateView()ͱঢ়ଶ෮ؼ • onSavedInstanceState()Ͱอଘͨ͠ঢ়ଶΛ෮ؼͤ͞Δ • ͔͠͠ɺonCreateView()Ͱ vp.setCurrentItem() ͯ͠ແ ࢹ͞ΕΔʂʂʂ • onCreateView()ͷ͋ͱʹFragment͕view
(VPؚΉ) ͷঢ় ଶΛ෮ؼ͢Δ͔ΒɺΒ͍͠ • onCreateView()Ͱঢ়ଶΛಡΈͩ͠ɺonResume()Ͱ vp.setCurrentItem()͢Δ͜ͱʹͨ͠
RVPͷ՝ • RVPΛᘳʹ࣮͢Δͷ͕͍͠ • v1.0.2࣌Ͱ PagerTitleStrip ͱͷڠௐ͕͏ ·͍͔͘ͳ͍όά͕͋Δ • RTLAOSPଆͰରԠͯ͘͠ΕΔͱخ͍͠
• ໘ͳ͜ͱGoogleͷΤϯδχΞʹ͍ͤͨ
That's all.
https://github.com/gfx/ TinyPdfReader