SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
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.
ご静聴ありがとうござ
いました!

Weitere ähnliche Inhalte

Was ist angesagt?

プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
プランニングツールにおけるインタラクティブな可視化を支えるバックエンドプランニングツールにおけるインタラクティブな可視化を支えるバックエンド
プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
Yahoo!デベロッパーネットワーク
 
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていることYahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
Yahoo!デベロッパーネットワーク
 

Was ist angesagt? (20)

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

Andere mochten auch (6)

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

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

cocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツールcocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツール
Tomoaki Shimizu
 
cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋
Tomoaki Shimizu
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
kimukou_26 Kimukou
 

Ähnlich wie タブブラウザSDKを作った話 #yjcamp (20)

ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnightヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
 
決済金融から始めるデータドリブンカンパニー
決済金融から始めるデータドリブンカンパニー決済金融から始めるデータドリブンカンパニー
決済金融から始めるデータドリブンカンパニー
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
Introduction for Browser Side MVC
Introduction for Browser Side MVCIntroduction for Browser Side MVC
Introduction for Browser Side MVC
 
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
[ABC2012S]Android2x/3x/4x対応アプリ開発Tips
 
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップWebアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ
 
WordPress × kintone API連携実践_たにぐち まこと氏
WordPress × kintone API連携実践_たにぐち まこと氏WordPress × kintone API連携実践_たにぐち まこと氏
WordPress × kintone API連携実践_たにぐち まこと氏
 
GREE Creators' Meetup #2 session B Manryo
GREE Creators' Meetup #2 session B ManryoGREE Creators' Meetup #2 session B Manryo
GREE Creators' Meetup #2 session B Manryo
 
cocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツールcocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツール
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】
 
Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.
 
Jetpack Composeのパフォーマンスの基本
Jetpack Composeのパフォーマンスの基本Jetpack Composeのパフォーマンスの基本
Jetpack Composeのパフォーマンスの基本
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
SHARPのエコ技を実装してみた
SHARPのエコ技を実装してみたSHARPのエコ技を実装してみた
SHARPのエコ技を実装してみた
 
cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋cocos2d-xハンズオン勉強会 in 名古屋
cocos2d-xハンズオン勉強会 in 名古屋
 
Dataworks Summit 2017 SanJose StreamProcessing - Hadoop Source Code Reading #...
Dataworks Summit 2017 SanJose StreamProcessing - Hadoop Source Code Reading #...Dataworks Summit 2017 SanJose StreamProcessing - Hadoop Source Code Reading #...
Dataworks Summit 2017 SanJose StreamProcessing - Hadoop Source Code Reading #...
 
ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
 
Cryogenでサイトつくろーじぇん
CryogenでサイトつくろーじぇんCryogenでサイトつくろーじぇん
Cryogenでサイトつくろーじぇん
 
PlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketPlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocket
 

Mehr von Yahoo!デベロッパーネットワーク

Mehr von Yahoo!デベロッパーネットワーク (20)

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

タブブラウザ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. ご静聴ありがとうござ いました!