webview
,用网页来布局。
Android
的
webview
是基于
webkit
内核,不过他的运行效果和
firefox
上如出一辙,因此写的时候都是先用
firefox
测试,测试
OK
了再放到程序里面看效果,基本上不会有什么问题。其实
android
的
webview
跟
iphone
的
webview
差很少,
iphone
上的
webview
比
android
上的强大多了。
谈一下研究
webview
的一些成果:
一.
加载资源的速度不慢,可是资源多了,就很慢。图片、
css
、
js
、
html
这些资源每一个大概须要
10-200ms
,通常都是
30ms
就
ok
了。若是一个页面上的资源不少,就很浪费时间。
二.
Js
和
css
的执行速度。开始的时候,个人页面都是用
js
生成
DOM
,添加样式等也用
js
添加。后来发现,加载一个页面竟然要
5-6
秒。而后我就怀疑是否是
js
的执行效率不高,而后就把能用
css
的地方都用
css
,能直接写到
html
上的就不用
js
动态生成。结果,速度并无多大的提高,最多提高了
1
秒。看来,
Js
的执行速度虽然比不上
css
,可是还不至于慢到那种程度。那会是什么缘由使得页面加载速度这么慢?通过仔细的排查,最终发现,是由于我用了
jQuery
框架。
Webview
加载页面的顺序是这样的:先加载
html
,而后从里面解析出
css
、
js
文件和页面上写死的图片资源进行加载,若是
webkit
的缓存里面有,就不加载。加载完这些资源以后,就进行
css
的渲染和
js
的执行。
Css
的渲染通常不须要很长时间,几十毫秒就
ok
。关键是
js
的执行,若是用了
jQuery
,则执行起来须要
5-6
秒。而在这段时间,若是不在
webview
里设置背景,网页部分是白色的,很难看。这是一个很糟糕的用户体验。因此若是用网页布局程序,最好别用很大的
js
框架。
三.
网页和
Java
之间的互调。这个功能是
iphone
里面就有的,网上也有不少资料,能够告诉咱们怎么作,这些都是很简单、很基本的。我研究了一段时间,总结一下:
1.
Java
调用
js
里面的函数,速度并不使人满意,大概一次一两百毫秒吧,若是要作交互性很强的事情,这种速度会让人疯掉的。而反过来就不同了,
js
去调
java
的方法,速度很快,基本上
40-50
毫秒一次。因此尽可能用
js
调用
java
方法,而不是
java
去调用
js
函数。
2.
Java
调用
js
的函数,没有返回值,而
Js
调用
java
方法,能够有返回值。返回值能够是字符串,也能够是对象。若是是字符串,有个很讨厌的问题,第
3
点我会讲的。若是是对象,这个对象会被转换为
js
的对象,直接能够访问里面的方法。可是我不推荐
java
返回给
js
的是对象,除非是必须。由于
js
收到
java
返回的对象,会产生一些交换对象,而若是这些对象的数量增长到了
500
或
600
以上,程序就会出问题。因此尽可能返回基本数据类型或者字符串。
3.
Js
调用
java
的方法,返回值若是是字符串,你会发现这个字符串是
native
的,不能对它进行一些修改操做,好比想对它
substr
,取不到。怎么解决呢?转成
locale
的。使用
toLocaleString()
函数就能够了。不过这个函数的速度并不快,转化的字符串若是不少,将会很耗费时间。
四.
网页上拖动元素。网页上有一个
div
,想要拖动它到另一个地方,怎么作?若是用
PC
上的网页作法,监听
onmousedown
、
onmousemove
和
onmouseup
就能够了。可是在手机上,事件模型就不同了。在网页上点击,拖动,而后释放,手离开屏幕的时候,
webview
才会触发
onmousedown
、
onmousemove
、
onmouseup
事件。因此,要想拖动,不能这么作。这个问题困扰我很长时间,后来发现
iphone
上的作法,才解决了。
Iphone
上的
webview
有专为触摸屏设计的事件
ontouchstart
、
ontouchmove
、
ontouchend
,这几个事件的响应是实时的,就能解决拖动的问题了。
五.
一些小问题。
Webview
里面的网页,若是有
input
,须要输入,可是点上去却没反应,输入法不出来。这种状况是由于
webview
没有获取焦点。须要在
java
里面给
webview
设置一下
requestFocus()
就好了。
六.
Android
上的
webview
和
iphone
的
webview
区别。目前为止,我发现的区别有这么几个:
1
.
Android
上,
webview
不支持多点触控,没有
ongesture
系列事件,而
iphone
上有。
2
.
Android
上的
webview
不支持透明,
iphone
上能够