-文章来源: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
参考文章: