Recording: http://www.paylas.com/video/android-gelistirici-gunleri-vitaliy-zasadnyy
Presentation about porting Web MMO games to Android and iOS. Sharing own experience and best practices.
ANDROID WORKSHOPWORKING WITH WEBVIEWVitaliy ZasadnyyADD Ankara, June 14-15
View Slide
ABOUT ME@zasadnyy
PREHISTORY10 games
OUR MMO GAMES
TASK FOR TODAY● provide custom layout● show loading screen● fancy progress dialog● replace some features with native analogs● Game container for
WebView APILoading Contentvoid loadUrl(String url)void loadData(String data, String mimeType,String mimeType)void postUrl(String url, byte[] postData)void reload()
WebView APISetting the Delegatevoid setWebViewClient(WebViewClient client)void setWebChromeClient(WebChromeClient client)
WebViewClient APILoading Content Callbacksvoid onPageStarted(WebView view, String url, Bitmapfavicon)void onPageFinished(WebView view, String url)void onReceivedError(WebView view, int errorCode,String description, String failingUrl)boolean shouldOverrideUrlLoading(WebView view,String url)
WebChromeClient APIEvent Callbacksboolean onJs...()void onProgressChanged(WebView view, intnewProgress)
T1: CUSTOM LAYOUTweb android
T1: CUSTOM LAYOUTeasy way == client side way@Overridepublic void onPageFinished(WebView view, String url) {view.loadUrl("javascript:{ /* js source */}");}
T1: CUSTOM LAYOUT: LET'S DO IT!
T1: CUSTOM LAYOUTeasy way == client side way@Overridepublic void onPageFinished(WebView view, String url) {...view.loadUrl("javascript:{ /* js source */}");}performance drawback
T1: CUSTOM LAYOUTnext idea: custom user-agent
T1: CUSTOM LAYOUT@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Map extraHeaders =new HashMap();extraHeaders.put(EXTRA_HEADER_CLIENT_TYPE, EXTRA_HEADER_VALUE));view.loadUrl(url, extraHeaders);return true;}cancel requestload with extra headerbetter idea: custom headers
T1: CUSTOM LAYOUTproblem 1: yourWebWiew.loadUrl("some url");solution 1:public class YourWebView extends WebView {...@Overridepublic void loadUrl(String url) {// load url with extra headers}...}
T1: CUSTOM LAYOUTproblem 2: yourWebWiew.reload();solution 2:public class YourWebView extends WebView {...@Overridepublic void reload() {String url = getUrl();// load url with extra headers}...}get current urlnot the best
T1: CUSTOM LAYOUTproblem 3:solution 3:post methods (e.g. forms)there is no solutionAOSP: Issue 9122
T2: LOADING SCREEN●starts at game launch●disappears only whenfirst page is loaded
T2: LOADING SCREENpublic class YourWebViewClient extends WebViewClient {...@Overridepublic void onPageStarted(WebView view, String url,Bitmapfavicon) {// show loading dialog}@Overridepublic void onPageFinished(WebView view, String url) {// hide loading dialog}...} problem
T2: LOADING SCREENpublic class YourWebViewClient extends WebViewClient {private String mStartUrl;...@Overridepublic void onPageStarted(WebView view, String url, Bitmapfavicon) {mStartUrl = url;// show fullscreen loading dialog}@Overridepublic void onPageFinished(WebView view, String url) {if (mStartUrl.equals(url))// hide loading dialogelse// redirect!}...}fixed
T2: LOADING SCREEN: LETS DO IT!
T3: FANCY PROGRESS DIALOGvoid onProgressChanged(WebView view, int progress){// set progress}progress == 100 ?!
T3: FANCY PROGRESS DIALOG: LET'S DO IT!
T3: REPLACE SOME FEATURESpublic class NravoWebViewClient extends WebViewClient {@Overridepublic boolean shouldOverrideUrlLoading(WebView view,String url) {// override behavior here}@Overridepublic void onPageStarted(WebView view, String url,Bitmapfavicon) {}@Overridepublic void onPageFinished(WebView view, String url) {if (!mIsRedirect) {view.loadUrl("javascript: { alert("Horray!");}");}}}
THANKS FOR YOUR ATTENTION!QUESTIONS?checkout this and other presentations at:zasadnyy.com/slides/