实现Android 版网页快照功能
现在一般的购物网站,在你完成交易后都会将页面拍照以免日后发生商务纠纷,而对于我们移动开发者这个传统互联网上的优秀经验也同样给了我们一些设计上的启迪,接下来我将几种实现思路写出来供大家参考。
方案一:使用WebViewClient的onPageFinished事件
我们使用WebView当做程序里的内嵌式浏览器的显示网页的时候,如果不进行特殊设置,当用户点击WebView里面的链接就会另外启动Android手机内置的浏览器,而离开当前的Activity,针对这一问题,我们可以进行自定义浏览器的客户端设置,代码如下:
- mWebView.setWebViewClient(new WebViewClient(){
- });
在setWebViewClient()的内容时,我们可以重写onPageFinished()来捕捉WebView加载完毕的事件,关键代码如下:
- /* WebView取得WebSettings */
- WebSettings webSettings = wView.getSettings();
- /* 设置能运行JavaScript */
- webSettings.setJavaScriptEnabled(true);
- /* */
- /* */
- /* WebView设置WebViewClient */
- wView.setWebViewClient(new WebViewClient(){
- @Override
- public void onPageFinished(WebView view, String url) {
- /* 获取画面 */
- Picture picture = view.capturePicture();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- /* 获取宽高 */
- int width = picture.getWidth();
- int height = picture.getHeight();
- if (width > 0 && height > 0) {
- Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- picture.draw(canvas);
- bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);
- FileOutputStream fos = null;
- try {
- if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
- fos = new FileOutputStream(Environment.getExternalStorageDirectory());
- if (fos!=null) {
- bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
- fos.close();
- Toast.makeText(ATestActivity.this, "快照保存成功",Toast.LENGTH_LONG).show();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- super.onPageFinished(view, url);
- }
- });
方案二:
使用View的 Bitmap getDrawingCached(boolean autoScale)方法实现,不过要注意的是cache
先要通过setDrawingCacheEnable方法把cache开启,然后再调用getDrawingCache方法就可以获得view的
cache图片了。buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,若果
cache没有建立,系统会自动调用buildDrawingCache方法生成cache。若果要更新cache,
必须要调用destoryDrawingCache方法把旧的cache销毁,才能建立新的。
当调用setDrawingCacheEnabled方法设置为false, 系统也会自动把原来的cache销毁。
ViewGroup在绘制子view时,而外提供了两个方法
void setChildrenDrawingCacheEnabled(boolean enabled)
setChildrenDrawnWithCacheEnabled(boolean enabled)
setChildrenDrawingCacheEnabled方法可以使viewgroup里所有的子view开启cache,
setChildrenDrawnWithCacheEnabled使在绘制子view时,若该子view开启了cache,
则使用它的cache进行绘制,从而节省绘制时间。
获取cache通常会占用一定的内存,所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。
- public static Bitmap convertViewToBitmap(View view){
- view.buildDrawingCache();
- Bitmap bitmap = view.getDrawingCache();
- return bitmap;
- }
一般情况下,直接使用上面方法是能够正常的工作。但有时候,生成Bitmap会出现问题(Bitmap全黑色)。主要原因是drawingCache的值大于系统给定的值。我们可以看一下buildDrawingCache()方法中的一段代码:
- if (width <= 0 || height <= 0 ||(width * height * (opaque && !translucentWindow ? 2 : 4) > ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {
- destroyDrawingCache();
- return;
- }
上面的代码中,width和height是所要cache的view绘制的宽度和高度,所以(width * height * (opaque
&& !translucentWindow ? 2 : 4)
计算的是当前所需要的cache大小。
ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系统
所提供的最大的DrawingCache的值。当所需要的drawingCache
>系统所提供的最大DrawingCache值时,生成Bitmap就会出现问题,此时获取的Bitmap就为null。
所以在只需要修改所需的cache值就可以解决问题了。代码实现如下:
- public static Bitmap convertViewToBitmap(View view){
- view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
- view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
- view.buildDrawingCache();
- Bitmap bitmap = view.getDrawingCache();
- return bitmap;
- }
实现Android 版网页快照功能的更多相关文章
- 微信 Android版隐藏功能代码
- 【项目记录】-液化气配送app android版
15年底参与过甲方呼叫中心平台开发.液化气配送app android版要求1个月开发完成.开发此项目以前我只有过一周android的开发经验.(与甲方签署过保密协议,遵循职业道德有些敏感信息不能写.) ...
- android版高仿淘宝客户端源码V2.3
android版高仿淘宝客户端源码V2.3,这个版本我已经更新到2.3了,源码也上传到源码天堂那里了,大家可以看一下吧,该应用实现了我们常用的购物功能了,也就是在手机上进行网购的流程的,如查看产品(浏 ...
- Android版xx助手之天天酷跑外挂具体分析
Android版xx助手之天天酷跑外挂具体分析 图/文 莫灰灰 背景 近些年来,移动互联网的大肆崛起,潜移默化中影响着人们的生活和工作习惯.当腾讯的微信平台接入手机游戏之后,移动端的游戏也開 ...
- 微信5.0 Android版飞机大战破解无敌模式手记
微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...
- android 实现分享功能两种方法
当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.ex ...
- 支付宝 Android 版使用的开源组件
支付宝 Android 版使用的开源组件 前言: 花了点时间整理了 支付宝 Android 客户端使用的开源组件,给需要的同学.在你不知道用什么开源框架的时候可以作下参考,毕竟支付宝是阿里的重量级产品 ...
- ShiWangMeSDK Android版接口文档 0.2.0 版
# ShiWangMeSDK Android版接口文档 0.2.0 版 android 总共有 14 个接口,分别涉及到初始化和对界面的一些细节的控制.下面详细介绍接口,如果没有特殊说明,接口都在 S ...
- 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
随机推荐
- hibernate注解原理
持续更新中.. hibernate注解用的是java注解,用到的是java反射机制.
- 简要介绍 My.Ioc 的用法
下面这段代码展示了 My.Ioc 的基本用法: using System; using System.Collections.Generic; namespace My.Ioc.Sample { pu ...
- 关于ISAPI和CGI限制,这个要设为允许
否则程序就报这个错误,注意,设置允许时不是在添加的网站上设置,而是在根iis,选择后右侧出现关于ISAPI和CGI限制,进去后选择相应版本,设置为允许就可以了
- SQL 查询字段为值不为空
方法一sql="select * from table where id<>null " or sql="select ...
- Memcached 深度分析
Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库 负载,提升性能.关于这个东西,相信很多人都用过,本文意在通过 ...
- SQL 无法打开物理文件 XXX.mdf",操作系统错误 5:"5(拒绝访问。)"
用T-SQL命令附加数据库时,出现如下异常信息: 无法打开物理文件 XXX.mdf".操作系统错误 5:"5(拒绝访问.)". (Microsoft SQL Server ...
- 搭建Struts2开发环境
搭建Struts2环境时,我们一般需要做以下几个步骤的工作: 1.创建javaweb工程 2.找到开发Struts2应用需要使用到的jar文件 3.创建jsp文件 4.创建action文件 5.编写S ...
- 多线程08-Callable和Future
1.简介 Callable是一个接口,与Runnable类似,包含一个必须实现的call方法,可以启动为让另一个线程来执行,执行Callable可以得到一个Future对象 该对象可以监听Callab ...
- PHP5中使用PDO连接数据库
PDO 如何连接 new PDO("mysql:host=localhost;dbname=php100","root", “ "); 默认这个不是 ...
- nodejs学习记录
一.环境搭建 1.安装express 局部安装 npm i express 全局安装 npm i -g express (命令行express无法使用) 环境变量 npm i -g express-g ...