SlideShare a Scribd company logo
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
小林 俊 Yahoo! JAPAN アプリエンジニア
タブブラウザSDK
を
作った話
2017年4月20日
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
アジェンダ
2
・自己紹介
・背景
・タブブラウザSDKとは
・三桁を実現させるタブの管理
・WebViewとCoordinatorLayout
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
自己紹介
3
名前:
小林 俊(こばやし しゅん)
担当サービス:
Yahoo! JAPAN アプリ
Android歴:そろそろ2年
アイマス歴:そろそろ10年
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
背景
4
Yahoo! JAPANYahoo!ブラウザ
ブラウザ機能を持つ2つのアプリ
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
背景
5
Yahoo! JAPANYahoo!ブラウザ
実は、共通化されたブラウザ機能を利用
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
タブブラウザSDKとは
6
どんな機能があるの?
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
タブブラウザSDKとは
7
・WebView管理
・タブ管理
・CoordinatorLayout対応
・URLスキーマハンドリング
・ページ内検索
・標準的な振る舞いの提供
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
タブブラウザSDKとは
8
・WebView管理
・タブ管理
・CoordinatorLayout対応
・URLスキーマハンドリング
・ページ内検索
・標準的な振る舞いの提供
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
タブ管理
9
三桁を実現させるタブの管理
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
10
タブ1 タブ2 タブ3 タブN
…
WebView1
WebView2
WebView M
…
上限M
上限N
全体像
「タブの上限」と
「WebViewの上限」は別扱い
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
11
タブ1 タブ2 タブ3
上限N
WebView1
WebView2
WebView3
上限3
タブ1→2→3の順に開かれた状態
4つ目のタブを開くと?
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
12
タブ1 タブ2 タブ3
上限N
WebView2
WebView3
上限3
タブ4
New!!!
WebView4
破棄
新しく4つ目のタブが開かれると
最もアクセス時刻の古いWebView1
が破棄される
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
13
タブ1
上限N
・open Tab1
・open Tab2
・open Tab3
・attach Tab1
・attach Tab3
・open Tab4
上記手順を踏んだ場合はWebView2が破
棄
WebView1
上限3
New!!!
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
14
タブ1 タブ2
上限N
・open Tab1
・open Tab2
・open Tab3
・attach Tab1
・attach Tab3
・open Tab4
上記手順を踏んだ場合はWebView2が破
棄
WebView1
WebView2
上限3
New!!!
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
15
タブ1 タブ2 タブ3
上限N
・open Tab1
・open Tab2
・open Tab3
・attach Tab1
・attach Tab3
・open Tab4
上記手順を踏んだ場合はWebView2が破
棄
WebView1
WebView2
WebView3
上限3
New!!!
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
16
タブ1 タブ2 タブ3
上限N
・open Tab1
・open Tab2
・open Tab3
・attach Tab1
・attach Tab3
・open Tab4
上記手順を踏んだ場合はWebView2が破
棄
WebView1
上限3
再表示
WebView2
WebView3
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
17
タブ1 タブ2 タブ3
上限N
・open Tab1
・open Tab2
・open Tab3
・attach Tab1
・attach Tab3
・open Tab4
上記手順を踏んだ場合はWebView2が破
棄
WebView2
WebView3
上限3
再表示
WebView1
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
18
タブ1 タブ2 タブ3
上限N
タブ4
・open Tab1
・open Tab2
・open Tab3
・attach Tab1
・attach Tab3
・open Tab4
上記手順を踏んだ場合はWebView2が破
棄
WebView1
WebView3
上限3
New!!!
WebView4
破棄
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
19
破棄されたWebView
保存・復元はどうなるか?
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
20
final Bundle state = new Bundle();
webview.saveState(state); // 保存用のメソッドが用意されている
state.putString(“url”, url);
state.putString(“title”, title);
// あとはファイルへ保存
■保存
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
21
// ファイルからBundleを読み込む
final String url = state.getString(“url”);
final String title = state.getString(“title”);
webview.restoreState(state); // 復元も同様に用意されている
■復元
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
三桁を実現させるタブの管理
22
まとめ
・タブとWebViewは別々に管理
・不要なWebViewは小まめに破棄
・WebViewの
saveState/restoreStateが便利
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
CoordinatorLayout対応
23
WebViewとCoordinatorLayout
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
WebViewとCoordinatorLayout
24
これだけではダメ!
<CoordinatorLayout>
 <AppBarLayout>
 <Toolbar

app:layout_scrollFlags="scroll|enterAlwaysCollapsed" />
 </AppBarLayout>

 <FrameLayout
app:layout_behavior=“AppBarLayout$ScrollingViewBehavior">
<WebView />
</FrameLayout>

</CoordinatorLayout>
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
WebViewとCoordinatorLayout
25
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html
https://developer.android.com/reference/android/webkit/WebView.html
WebViewにはNestedScrollingChildが実装され
ていない。自分で実装が必要。
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
WebViewとCoordinatorLayout
26
public class CommonWebView extends WebView implements NestedScrollingChild {
private final NestedScrollingChildHelper mHelper;
private float mPrevY;
@SuppressWarnings("CheckStyle")
private final int[] mConsumed = new int[2];
public CommonWebView(final @NonNull Context context) {
super(context);
mHelper = new NestedScrollingChildHelper(this);
setNestedScrollingEnabled(true);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
switch (action) {
…
}
return super.onTouchEvent(event);
}
@Override
public void setNestedScrollingEnabled(final boolean enabled) {
mHelper.setNestedScrollingEnabled(enabled);
}
(省略)
}
これだけでは不十分
ウェブの表現を考慮す
る必要がある
・地図操作
・カルーセル
・ピンチイン・アウト
対応例を次スライドか
ら紹介
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
WebViewとCoordinatorLayout
27
public CommonWebView(final @NonNull Context context) {
super(context);
final ViewConfiguration configuration = ViewConfiguration.get(context);
mTouchSlop = configuration.getScaledPagingTouchSlop();
}
private void onTouchMove(MotionEvent event) {
if (mScrolling) {
final int dy = (int) (mPrevY - event.getRawY());
dispatchNestedPreScroll(0, dy, mConsumed, null);
final int consumedY = mConsumed[1];
dispatchNestedScroll(0, consumedY, 0, dy - consumedY, null);
} else {
final float dx = Math.abs(mStartX - event.getRawX());
final float dy = Math.abs(mStartY - event.getRawY());
if (dy > dx && dy > mTouchSlop && mScrollable) {
mScrolling = true;
startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
}
}
}
横スクロール時に縦スクロールが発生する事による、
WebViewの移動&サイズ変更による操作の阻害
・縦横の移動量を考慮(dy > dx)
・縦についても遊びを持たせる(dy > mTouchSlop)
・地図操作
・カルーセル
・ピンチイン・アウト
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
WebViewとCoordinatorLayout
28
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
(略)
case MotionEvent.ACTION_MOVE:
if (event.getPointerCount() != 1) {
break;
}
onTouchMove(event);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
(略)
default:
break;
}
mPrevY = event.getRawY();
return super.onTouchEvent(event);
}
スクロール操作以外で動かないようにする。
・タッチポイントの数を検知
(event.getPointerCount() != 1)
・地図操作
・カルーセル
・ピンチイン・アウト
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
WebViewとCoordinatorLayout
29
@Override
protected int computeVerticalScrollRange() {
final int verticalScrollRange = super.computeVerticalScrollRange();
mScrollable = verticalScrollRange > getHeight() + mScrollMargin;
return verticalScrollRange;
}
WebViewサイズいっぱいで
操作させるページで動かないように。
・サイトのコンテンツサイズ(高さ)と
WebViewのサイズを比較
・地図操作
・カルーセル
・ピンチイン・アウト
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
WebViewとCoordinatorLayout
30
まとめ
・WebViewにNestedScrollChildを実装
・ウェブサイトの作りへの考慮が必要
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
ご静聴ありがとうござ
いました!

More Related Content

What's hot (20)

PDF
決済金融から始めるデータドリブンカンパニー #yjmu
Yahoo!デベロッパーネットワーク
 
PDF
ヤフーにおけるHadoop Operations #tdtech
Yahoo!デベロッパーネットワーク
 
PDF
YJTC18 A-1 大規模サーバの戦略
Yahoo!デベロッパーネットワーク
 
PDF
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
Yahoo!デベロッパーネットワーク
 
PPTX
全社デザインシステムとサービスの付き合い方
Yahoo!デベロッパーネットワーク
 
PDF
Yahoo!ブラウザーにおける市場環境の分析と戦略化
Yahoo!デベロッパーネットワーク
 
PDF
AMPと広告とOpenRTBと #yjmu
Yahoo!デベロッパーネットワーク
 
PDF
Automation of Rolling Upgrade of Hadoop Cluster without Data Lost and Job Fai...
Yahoo!デベロッパーネットワーク
 
PDF
kukai: 省エネ世界2位のディープラーニング・スパコン
Yahoo!デベロッパーネットワーク
 
PDF
ヤフーでHardeningを実施する意味 (#sec_kansai #sosaisec)
Yahoo!デベロッパーネットワーク
 
PDF
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
Yahoo!デベロッパーネットワーク
 
PDF
プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
Yahoo!デベロッパーネットワーク
 
PDF
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
Yahoo!デベロッパーネットワーク
 
PDF
Bonfire API #1 APIのリトライ処理
Yahoo!デベロッパーネットワーク
 
PDF
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
Yahoo!デベロッパーネットワーク
 
PDF
Serving Engine as a Service at Yahoo! JAPAN #SolrJP
Yahoo!デベロッパーネットワーク
 
PDF
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
Yahoo!デベロッパーネットワーク
 
PDF
Spring Cloud Data Flow の紹介 #streamctjp
Yahoo!デベロッパーネットワーク
 
PPTX
セキュリティ教育とUX ~結ばれていた赤い糸~
Yahoo!デベロッパーネットワーク
 
決済金融から始めるデータドリブンカンパニー #yjmu
Yahoo!デベロッパーネットワーク
 
ヤフーにおけるHadoop Operations #tdtech
Yahoo!デベロッパーネットワーク
 
YJTC18 A-1 大規模サーバの戦略
Yahoo!デベロッパーネットワーク
 
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
Yahoo!デベロッパーネットワーク
 
全社デザインシステムとサービスの付き合い方
Yahoo!デベロッパーネットワーク
 
Yahoo!ブラウザーにおける市場環境の分析と戦略化
Yahoo!デベロッパーネットワーク
 
AMPと広告とOpenRTBと #yjmu
Yahoo!デベロッパーネットワーク
 
Automation of Rolling Upgrade of Hadoop Cluster without Data Lost and Job Fai...
Yahoo!デベロッパーネットワーク
 
kukai: 省エネ世界2位のディープラーニング・スパコン
Yahoo!デベロッパーネットワーク
 
ヤフーでHardeningを実施する意味 (#sec_kansai #sosaisec)
Yahoo!デベロッパーネットワーク
 
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
Yahoo!デベロッパーネットワーク
 
プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
Yahoo!デベロッパーネットワーク
 
Bonfire API #1 APIのリトライ処理
Yahoo!デベロッパーネットワーク
 
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
Yahoo!デベロッパーネットワーク
 
Serving Engine as a Service at Yahoo! JAPAN #SolrJP
Yahoo!デベロッパーネットワーク
 
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
Yahoo!デベロッパーネットワーク
 
Spring Cloud Data Flow の紹介 #streamctjp
Yahoo!デベロッパーネットワーク
 
セキュリティ教育とUX ~結ばれていた赤い糸~
Yahoo!デベロッパーネットワーク
 

Viewers also liked (6)

PDF
Kotlin と Rxjava2
Recruit Lifestyle Co., Ltd.
 
PPTX
マスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービス
Toshiyuki Hirata
 
PDF
"大規模アプリケーション"を支える設計 #yjcamp
Yahoo!デベロッパーネットワーク
 
PDF
WWDC2017 レポート & Quick Look Preview Extension について
Yahoo!デベロッパーネットワーク
 
PDF
Yahoo! JAPANアプリのデータベース処理改善 #yjcamp
Yahoo!デベロッパーネットワーク
 
PPTX
DeNAにおけるSWETの役割
Toshiyuki Hirata
 
Kotlin と Rxjava2
Recruit Lifestyle Co., Ltd.
 
マスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービス
Toshiyuki Hirata
 
"大規模アプリケーション"を支える設計 #yjcamp
Yahoo!デベロッパーネットワーク
 
WWDC2017 レポート & Quick Look Preview Extension について
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANアプリのデータベース処理改善 #yjcamp
Yahoo!デベロッパーネットワーク
 
DeNAにおけるSWETの役割
Toshiyuki Hirata
 
Ad

Similar to タブブラウザSDKを作った話 #yjcamp (20)

PPTX
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
Yahoo!デベロッパーネットワーク
 
POTX
決済金融から始めるデータドリブンカンパニー
Tokuhiro Eto
 
PDF
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports
 
PDF
Introduction for Browser Side MVC
Ryunosuke SATO
 
KEY
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
Kenichi Kambara
 
PPTX
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
Naoki Iwami
 
PDF
WordPress × kintone API連携実践_たにぐち まこと氏
kintone papers
 
PDF
GREE Creators' Meetup #2 session B Manryo
Shiho Manryo
 
PDF
cocos2d-xにおけるBox2Dの利用方法および便利なツール
Tomoaki Shimizu
 
PDF
レスポンシブWebデザイン【発展編】
Yasuhito Yabe
 
PDF
Android Lecture #01 @PRO&BSC Inc.
Yuki Higuchi
 
PDF
Jetpack Composeのパフォーマンスの基本
Damper Matsu
 
PDF
実践 NestJS
Ayumi Goto
 
PDF
SHARPのエコ技を実装してみた
android sola
 
PDF
cocos2d-xハンズオン勉強会 in 名古屋
Tomoaki Shimizu
 
PDF
Dataworks Summit 2017 SanJose StreamProcessing - Hadoop Source Code Reading #...
Yahoo!デベロッパーネットワーク
 
PDF
ReduxとSwiftの組み合わせ:改訂版
Fumiya Sakai
 
PDF
griffon plugin を 実際に作ってみよう #jggug
kimukou_26 Kimukou
 
PDF
Cryogenでサイトつくろーじぇん
Kazuhiro Hara
 
PDF
星野リゾートにおけるインフラ内製化の試行錯誤について~AWSの導入の歴史から組織拡大について
崇介 藤井
 
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
Yahoo!デベロッパーネットワーク
 
決済金融から始めるデータドリブンカンパニー
Tokuhiro Eto
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports
 
Introduction for Browser Side MVC
Ryunosuke SATO
 
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
Kenichi Kambara
 
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
Naoki Iwami
 
WordPress × kintone API連携実践_たにぐち まこと氏
kintone papers
 
GREE Creators' Meetup #2 session B Manryo
Shiho Manryo
 
cocos2d-xにおけるBox2Dの利用方法および便利なツール
Tomoaki Shimizu
 
レスポンシブWebデザイン【発展編】
Yasuhito Yabe
 
Android Lecture #01 @PRO&BSC Inc.
Yuki Higuchi
 
Jetpack Composeのパフォーマンスの基本
Damper Matsu
 
実践 NestJS
Ayumi Goto
 
SHARPのエコ技を実装してみた
android sola
 
cocos2d-xハンズオン勉強会 in 名古屋
Tomoaki Shimizu
 
Dataworks Summit 2017 SanJose StreamProcessing - Hadoop Source Code Reading #...
Yahoo!デベロッパーネットワーク
 
ReduxとSwiftの組み合わせ:改訂版
Fumiya Sakai
 
griffon plugin を 実際に作ってみよう #jggug
kimukou_26 Kimukou
 
Cryogenでサイトつくろーじぇん
Kazuhiro Hara
 
星野リゾートにおけるインフラ内製化の試行錯誤について~AWSの導入の歴史から組織拡大について
崇介 藤井
 
Ad

More from Yahoo!デベロッパーネットワーク (20)

PDF
ゼロから始める転移学習
Yahoo!デベロッパーネットワーク
 
PDF
継続的なモデルモニタリングを実現するKubernetes Operator
Yahoo!デベロッパーネットワーク
 
PDF
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
Yahoo!デベロッパーネットワーク
 
PDF
オンプレML基盤on Kubernetes パネルディスカッション
Yahoo!デベロッパーネットワーク
 
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Yahoo!デベロッパーネットワーク
 
PDF
Persistent-memory-native Database High-availability Feature
Yahoo!デベロッパーネットワーク
 
PDF
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
Yahoo!デベロッパーネットワーク
 
PDF
eコマースと実店舗の相互利益を目指したデザイン #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
ビッグデータから人々のムードを捉える #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
サイエンス領域におけるMLOpsの取り組み #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
「新しいおうち探し」のためのAIアシスト検索 #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
Yahoo!デベロッパーネットワーク
 
ゼロから始める転移学習
Yahoo!デベロッパーネットワーク
 
継続的なモデルモニタリングを実現するKubernetes Operator
Yahoo!デベロッパーネットワーク
 
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
Yahoo!デベロッパーネットワーク
 
オンプレML基盤on Kubernetes パネルディスカッション
Yahoo!デベロッパーネットワーク
 
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Yahoo!デベロッパーネットワーク
 
Persistent-memory-native Database High-availability Feature
Yahoo!デベロッパーネットワーク
 
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
Yahoo!デベロッパーネットワーク
 
eコマースと実店舗の相互利益を目指したデザイン #yjtc
Yahoo!デベロッパーネットワーク
 
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
 
ビッグデータから人々のムードを捉える #yjtc
Yahoo!デベロッパーネットワーク
 
サイエンス領域におけるMLOpsの取り組み #yjtc
Yahoo!デベロッパーネットワーク
 
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo!デベロッパーネットワーク
 
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
Yahoo!デベロッパーネットワーク
 
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
Yahoo!デベロッパーネットワーク
 
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
Yahoo!デベロッパーネットワーク
 
「新しいおうち探し」のためのAIアシスト検索 #yjtc
Yahoo!デベロッパーネットワーク
 
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
Yahoo!デベロッパーネットワーク
 

Recently uploaded (6)

PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
Google Driveハブ型Obsidian同期環境:PC編集とモバイル閲覧を安全・効率的に実現するクロスデバイス構築ガイド
honeshabri
 
PDF
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
Google Driveハブ型Obsidian同期環境:PC編集とモバイル閲覧を安全・効率的に実現するクロスデバイス構築ガイド
honeshabri
 
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 

タブブラウザSDKを作った話 #yjcamp

  • 1. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 小林 俊 Yahoo! JAPAN アプリエンジニア タブブラウザSDK を 作った話 2017年4月20日
  • 2. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ 2 ・自己紹介 ・背景 ・タブブラウザSDKとは ・三桁を実現させるタブの管理 ・WebViewとCoordinatorLayout
  • 3. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 自己紹介 3 名前: 小林 俊(こばやし しゅん) 担当サービス: Yahoo! JAPAN アプリ Android歴:そろそろ2年 アイマス歴:そろそろ10年
  • 4. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 背景 4 Yahoo! JAPANYahoo!ブラウザ ブラウザ機能を持つ2つのアプリ
  • 5. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 背景 5 Yahoo! JAPANYahoo!ブラウザ 実は、共通化されたブラウザ機能を利用
  • 6. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. タブブラウザSDKとは 6 どんな機能があるの?
  • 7. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. タブブラウザSDKとは 7 ・WebView管理 ・タブ管理 ・CoordinatorLayout対応 ・URLスキーマハンドリング ・ページ内検索 ・標準的な振る舞いの提供
  • 8. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. タブブラウザSDKとは 8 ・WebView管理 ・タブ管理 ・CoordinatorLayout対応 ・URLスキーマハンドリング ・ページ内検索 ・標準的な振る舞いの提供
  • 9. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. タブ管理 9 三桁を実現させるタブの管理
  • 10. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 10 タブ1 タブ2 タブ3 タブN … WebView1 WebView2 WebView M … 上限M 上限N 全体像 「タブの上限」と 「WebViewの上限」は別扱い
  • 11. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 11 タブ1 タブ2 タブ3 上限N WebView1 WebView2 WebView3 上限3 タブ1→2→3の順に開かれた状態 4つ目のタブを開くと?
  • 12. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 12 タブ1 タブ2 タブ3 上限N WebView2 WebView3 上限3 タブ4 New!!! WebView4 破棄 新しく4つ目のタブが開かれると 最もアクセス時刻の古いWebView1 が破棄される
  • 13. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 13 タブ1 上限N ・open Tab1 ・open Tab2 ・open Tab3 ・attach Tab1 ・attach Tab3 ・open Tab4 上記手順を踏んだ場合はWebView2が破 棄 WebView1 上限3 New!!!
  • 14. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 14 タブ1 タブ2 上限N ・open Tab1 ・open Tab2 ・open Tab3 ・attach Tab1 ・attach Tab3 ・open Tab4 上記手順を踏んだ場合はWebView2が破 棄 WebView1 WebView2 上限3 New!!!
  • 15. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 15 タブ1 タブ2 タブ3 上限N ・open Tab1 ・open Tab2 ・open Tab3 ・attach Tab1 ・attach Tab3 ・open Tab4 上記手順を踏んだ場合はWebView2が破 棄 WebView1 WebView2 WebView3 上限3 New!!!
  • 16. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 16 タブ1 タブ2 タブ3 上限N ・open Tab1 ・open Tab2 ・open Tab3 ・attach Tab1 ・attach Tab3 ・open Tab4 上記手順を踏んだ場合はWebView2が破 棄 WebView1 上限3 再表示 WebView2 WebView3
  • 17. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 17 タブ1 タブ2 タブ3 上限N ・open Tab1 ・open Tab2 ・open Tab3 ・attach Tab1 ・attach Tab3 ・open Tab4 上記手順を踏んだ場合はWebView2が破 棄 WebView2 WebView3 上限3 再表示 WebView1
  • 18. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 18 タブ1 タブ2 タブ3 上限N タブ4 ・open Tab1 ・open Tab2 ・open Tab3 ・attach Tab1 ・attach Tab3 ・open Tab4 上記手順を踏んだ場合はWebView2が破 棄 WebView1 WebView3 上限3 New!!! WebView4 破棄
  • 19. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 19 破棄されたWebView 保存・復元はどうなるか?
  • 20. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 20 final Bundle state = new Bundle(); webview.saveState(state); // 保存用のメソッドが用意されている state.putString(“url”, url); state.putString(“title”, title); // あとはファイルへ保存 ■保存
  • 21. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 21 // ファイルからBundleを読み込む final String url = state.getString(“url”); final String title = state.getString(“title”); webview.restoreState(state); // 復元も同様に用意されている ■復元
  • 22. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 三桁を実現させるタブの管理 22 まとめ ・タブとWebViewは別々に管理 ・不要なWebViewは小まめに破棄 ・WebViewの saveState/restoreStateが便利
  • 23. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. CoordinatorLayout対応 23 WebViewとCoordinatorLayout
  • 24. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. WebViewとCoordinatorLayout 24 これだけではダメ! <CoordinatorLayout>
 <AppBarLayout>
 <Toolbar
 app:layout_scrollFlags="scroll|enterAlwaysCollapsed" />
 </AppBarLayout>

 <FrameLayout app:layout_behavior=“AppBarLayout$ScrollingViewBehavior"> <WebView /> </FrameLayout>

</CoordinatorLayout>
  • 25. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. WebViewとCoordinatorLayout 25 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html https://developer.android.com/reference/android/webkit/WebView.html WebViewにはNestedScrollingChildが実装され ていない。自分で実装が必要。
  • 26. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. WebViewとCoordinatorLayout 26 public class CommonWebView extends WebView implements NestedScrollingChild { private final NestedScrollingChildHelper mHelper; private float mPrevY; @SuppressWarnings("CheckStyle") private final int[] mConsumed = new int[2]; public CommonWebView(final @NonNull Context context) { super(context); mHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } @Override public boolean onTouchEvent(MotionEvent event) { final int action = event.getAction(); switch (action) { … } return super.onTouchEvent(event); } @Override public void setNestedScrollingEnabled(final boolean enabled) { mHelper.setNestedScrollingEnabled(enabled); } (省略) } これだけでは不十分 ウェブの表現を考慮す る必要がある ・地図操作 ・カルーセル ・ピンチイン・アウト 対応例を次スライドか ら紹介
  • 27. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. WebViewとCoordinatorLayout 27 public CommonWebView(final @NonNull Context context) { super(context); final ViewConfiguration configuration = ViewConfiguration.get(context); mTouchSlop = configuration.getScaledPagingTouchSlop(); } private void onTouchMove(MotionEvent event) { if (mScrolling) { final int dy = (int) (mPrevY - event.getRawY()); dispatchNestedPreScroll(0, dy, mConsumed, null); final int consumedY = mConsumed[1]; dispatchNestedScroll(0, consumedY, 0, dy - consumedY, null); } else { final float dx = Math.abs(mStartX - event.getRawX()); final float dy = Math.abs(mStartY - event.getRawY()); if (dy > dx && dy > mTouchSlop && mScrollable) { mScrolling = true; startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL); } } } 横スクロール時に縦スクロールが発生する事による、 WebViewの移動&サイズ変更による操作の阻害 ・縦横の移動量を考慮(dy > dx) ・縦についても遊びを持たせる(dy > mTouchSlop) ・地図操作 ・カルーセル ・ピンチイン・アウト
  • 28. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. WebViewとCoordinatorLayout 28 @Override public boolean onTouchEvent(MotionEvent event) { final int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: (略) case MotionEvent.ACTION_MOVE: if (event.getPointerCount() != 1) { break; } onTouchMove(event); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: (略) default: break; } mPrevY = event.getRawY(); return super.onTouchEvent(event); } スクロール操作以外で動かないようにする。 ・タッチポイントの数を検知 (event.getPointerCount() != 1) ・地図操作 ・カルーセル ・ピンチイン・アウト
  • 29. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. WebViewとCoordinatorLayout 29 @Override protected int computeVerticalScrollRange() { final int verticalScrollRange = super.computeVerticalScrollRange(); mScrollable = verticalScrollRange > getHeight() + mScrollMargin; return verticalScrollRange; } WebViewサイズいっぱいで 操作させるページで動かないように。 ・サイトのコンテンツサイズ(高さ)と WebViewのサイズを比較 ・地図操作 ・カルーセル ・ピンチイン・アウト
  • 30. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. WebViewとCoordinatorLayout 30 まとめ ・WebViewにNestedScrollChildを実装 ・ウェブサイトの作りへの考慮が必要
  • 31. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ご静聴ありがとうござ いました!