Android WebView优化
2015-08-25 12:04
381 查看
Android webview用户体验优化-场景恢复
分类: webview Android2015-03-2714:19 329人阅读 评论(1) 收藏 举报
webviewrestoreStateWebView滚动WebView位置保留WebView位置恢复
上一篇文章讲到了webview技术方面的优化(没有看到的朋友可以看看http://blog.csdn.net/fkingu007/article/details/44650031),这次进一步完善一下,主要完成状态保留工作,也是解决了我的一个疑问,下面看看如何做到的。
转载请标明文章出处 http://blog.csdn.net/fkingu007/article/details/44675129,尊重原创。
1、 activity意外被杀
上个博文已经说到了,在onSaveInstanceState(Bundle)调用webview.saveState(bundle)保存状态,在onCreate(Bundle saveInstanceState)里通过savedInstanceState == null判断,不为null,即可通过webview.restoreState(bundle)恢复,这里不多讲了。
2、用户正常back
我们都知道back是不会触发onSaveInstanceState()方法的,那么我们就得通过其他途径保存状态了,哈哈,研究发现可以通过webview.getContentHeight(),webview.getSrollY()得到滚动位置所占html页面实际内容长度的比例,由于html加载内容可能显示不完全,getContentHeight()的值很有可能是会变化的,所以我们最好算出这个百分比,下次恢复的时候也根据百分比再滚动,思路有了,代码实现就没问题啦,下面是关键代码:
[java] view
plaincopyprint?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
// 计算当前滚动位置所占网页内容的百分比
private float calculateProgression(WebView content) {
float positionTopView = content.getTop();
float contentHeight = content.getContentHeight();
float currentScrollPosition = content.getScrollY();
float percentWebview = (currentScrollPosition - positionTopView) / contentHeight;
Log.e(TAG, "positionTopView:"+positionTopView);
Log.e(TAG, "contentHeight:"+contentHeight);
Log.e(TAG, "currentScrollPosition:"+currentScrollPosition);
Log.e(TAG, "percentWebview:"+percentWebview);
return percentWebview;
}
onDestory()里保留一下这个值:
[java] view
plaincopyprint?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
@Override
protected void onDestroy() {
mProgressToRestore = calculateProgression(wv);
ll.removeAllViews();
wv.stopLoading();
wv.removeAllViews();
wv.destroy();
wv = null;
ll = null;
super.onDestroy();
}
WebViewClient.onPageFinished()里进行滚动,加一个标志位只跳转一次
[java] view
plaincopyprint?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
if (mHasToRestoreState && 0<mProgressToRestore) {
mHasToRestoreState = false;
view.postDelayed(new Runnable() {
@Override
public void run() {
float webviewsize = wv.getContentHeight() - wv.getTop();
float positionInWV = webviewsize * mProgressToRestore;
int positionY = (int) (wv.getTop() + positionInWV);
wv.scrollTo(0, positionY);
}
// 延迟一下
}, 100);
}
super.onPageFinished(view, url);
Log.d(TAG, "pageFinished:"+url);
}
就是这么做到的,大家可以试试效果。
相关文章推荐
- 解读Android之Activity(1)基础知识
- 微信公众平台开发【素材管理】获取临时素材
- 微信公众平台开发【素材管理】获取临时素材
- Android-ScrollView(基本实现,顶部判断,底部判断,底部加载更多)
- Android下SQLite数据库学习笔记2——Android下SQL语句实现数据库的增删改查
- android NDK 开发步骤
- Unity3D EasyTouch 初步使用教程(详细)
- java的初始化研究:android开发中遇到的一个奇怪问题
- iOS开发日记9-终端命令
- iOS 隐藏Status Bar
- android ip地址,手机号码,邮箱格式验证
- iOS正则
- Swift2.0中使用闭包表达式进行类之间进行通信
- iOS标准时间与时间戳相互转换
- IOS学习第二篇 ——引用计数器内存管理
- android webview load 本地文件需要注意的地方
- iOS 字体滚动效果 ScrollLabel
- Android listview 属性解析
- 关于cocos2dx如何绑定c++的静态方法和类给lua调用
- iOS开发_统计xcode代码行数