-文章来源:itsCoder 的 WeeklyBolg 项目
- itsCoder主页:http://itscoder.com/
- 作者:yongyu0102
- 审阅者:wuchangfeng
一、概要
最近在公司的项目中遇到需求如下:
- 点击 WebView 页面的图片实现开启查看图片模式,即可以显示点击的图片,然后滑动显示下一张图片。  
- 长按 WebView 页面图片弹出对话框可以选择保存长按的图片到本地相册。  
拿到这个需求笔者第一反应是没做过 WebView 相关的交互,甚至分不清这个需求是否需要服务端配合完成 Java 与 JavaScript 的互相调用,一脸茫然。遇到这种情况笔者的解决思路一般分两个方向:
- 找一个比较出名的客户端有类似功能的,然后 Google 搜索,仿 XXXX,先粗略看一下有没有现成的 Demo 可以参考,比如我这个需要,先去搜索一下 ”Android 仿微信朋友圈浏览图片效果“ (这个搜索关键字很关键啊),可是笔者没找到符合该需要的 Demo。 
- 在第一个方案不好使的情况下,我们没有了参考,那么咱们就得自己思考这个大概实现思路,然后把这个需求进行拆分,逐一击破。所以思考大概如下: - (1)要想展示图片那么就得先拿到图片,要拿到图片只有两种可能,第一种可能是 WebView 本身缓存了图片,我们去缓存中读取图片进行显示,可是想一下,咱们浏览微博看图的时候如果没有网,这时候去点击图片那么图片是加载不出来的,所以这种可能否定了;所以只有第二种可能就是点击图片的时候拿到该图片对应的 URL 网址,然后咱们自己去网络加载图片进行显示,所以这个点我们 Get 到了。 - (2)要滑动图片进行显示下一张,那么就需要我们能拿到所有要显示的图片的 URL ,然后放到一个数组里面,每次滑动就进行加载一张图片,那么也就是我们一次性拿到所有 WebView 包含图片的 URL,这个就不是在点击图片的时候去获取,而是在 WebView 加载完成后获取到,这怎么能拿到?再想一下,WebView 进行加载显示的时候其实是加载 HTML(比如 Assets 目录中的文件)文本的字符串,然后进行渲染处理显示出来,所以 HTML文本文件里面包含了我们想要的图片网址,大家看一下下面这张截图就是一个带图片的 WebView 对应加载的 HTML文本文件部分截图,  - 其中标签 src 对象的内容就是我们想要的图片 URL,所以到这里我们就有了思路,我们先拿到 WebView 加载的 HTML 内容,然后在从 HTML 里面提取我要想要的 URL。 - (3)现在我们能拿到所有图片对应的 URL,那么滑动图片显示下一张就简单了,我们直接用一个 ViewPager 来实现滑动加载图片即可。 - 总结要实现这个需要我们需要做的工作有: - 拿到 WebView 加载的 HTML 文本。
- 从 HTML 文本中提取所有图片对应的 URL。
- 处理 WebView 中图片的点击和长按响应事件。
- 用 ViewPager 来实现滑动加载下一张图片。
 - 下面我们就按照以上几个步骤来实现我们想要的功能。 
二、主要内容
2.1 获取 WebView 页面所有图片对应地址
2.1.1 解析 WebView 页面加载的 HTML文本文件
定义供 JavaScript 调用的交互接口
| 
 | 
 | 
WebView 开启 JavaScript 脚本执行,调用 JavaScript 代码
| 
 | 
 | 
2.1.2 从获取到的 HTML文本文件中提取页面所有图片对应的地址对象
| 
 | 
 | 
到这里我们获取到了 WebView 页面中所有图片对象对应的 URL 地址,下面就还差一步,就是在点击 WebView 界面的图片时候去响应点击事件,然后把相应的 URL 地址传递给 ViewPager 进行显示就齐活了。
2.2 响应 WebView 界面图片的点击事件
2.2.1定义供 JavaScript 调用的交互接口
| 
 | 
 | 
2.2.2 WebView 开启 JavaScript 脚本执行,调用 JavaScript 代码
| 
 | 
 | 
到这里我们完成了前两步,拿去到 WebView 界面图片对应的所有 URL 地址和响应 WebView 界面图片的点击事件,下面的事情就简单了,用 ViewPager 滑动显示每一张图片,再我们进行最后一步之前,我们再来实现一个功能就是长按 WebView 界面图片,弹出对话框来,然后可以选择保存图片功能,代码如下:
WebView 中图片长按点击事件处理
| 
 | 
 | 
2.3 ViewPager 滑动显示每一张图片,PhotoView 实现自由缩放功能
由于这部分代码比较简单,这里就直接贴出部分代码,文章中所用的 Demo 代码最终会上传到 GitHub上,有兴趣可以去瞧一瞧完整的代码,这里简单介绍几个类,ShowImageFromWebActivity.java 这个类内部就包含一个 ViewPager 和两个按钮, ViewPager 用来滑动显示每一张图片,按钮用来显示滑动的页数和实现点击保存图片功能,代码如下:
| 
 | 
 | 
ShowImageFromWebActivity.java 对应 xml 文件
| 
 | 
 | 
ImageBrowserAdapter.java 类代码如下:
| 
 | 
 | 
上面代码也很简单,就是根据 URL 来加载显示图片,然后利用 PhotoView 进行缩放。
| 
 | 
 | 
以上为本次学习内容,如有错误还望指正,谢谢!
文章中 Demo 已经上传在 GitHub上,地址为ShowImageFromWebView
参考文章: