在APP项目的开发过程中,经常会用到分享图片的功能,有时候还需要根据当前用户信息获取指定的分享图片,比如要求在用户分享图中显示用户名、Uid、用户头像等信息。想到的实现方法主要有两点:
1.通过android SDK自带的Canvas方法进行绘制。
2.通过webView实现客户端与H5交互,然后将H5界面做截图处理。
本文主要介绍第二种方式的实现过程,第一种方式的实现方法,后续有时间会在博客中做说明,下面开始本文内容。
首先确定我们要实现的逻辑:
1.客户端与H5的交互,客户端将用户信息(用户名、Uid、用户头像等)发送给H5;
2.客户端截取WebView功能的实现;
3.分享功能的添加。
1.客户端与H5交互
在界面布局中添加webView布局,对WebView布局进行初始化操作(此处需要网络权限,不做单独处理)
wv_imgweb = (WebView) findViewById(R.id.h5_wv_imgweb);
WebSettings webSettings = wv_imgweb.getSettings(); //此处可更加具体的H5界面功能进行相应的WebSettings设置,本文只是演示基本效果 webSettings.setJavaScriptEnabled(true); webSettings.setSupportZoom(false); wv_imgweb.requestFocusFromTouch(); wv_imgweb.setDrawingCacheEnabled(true); wv_imgweb.setVerticalScrollBarEnabled(false); wv_imgweb.setHorizontalScrollBarEnabled(false); wv_imgweb.setVerticalScrollbarOverlay(false); wv_imgweb.setHorizontalScrollbarOverlay(false); wv_imgweb.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //加载逻辑的处理 } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); //加载逻辑的处理 } }); //添加用户信息参数,加载H5分享地址 wv_imgweb.loadUrl(h5_url);
2.截图功能的实现
上文中的WebView页面加载完成后,即可调用截图功能,并将图片保存在本地指定文件夹(此处需要存储权限,不做单独处理)
android中WebView可以通过多种方式实现截图,下面分别做不同介绍:
2.1截取屏幕内内容
第一种方式是通过Bitmap bitmap = webView.getDrawingCache()截取屏幕内显示内容,注意调用此方法setDrawingCacheEnabled(true)必须设置为true;
2.2截取整个WebView内容
第二种方式是通过Picture snapShot = wv_imgweb.capturePicture()来截取整个WebView的内容
Picture snapShot = wv_imgweb.capturePicture(); if (snapShot != null && snapShot.getWidth() > 0 && snapShot.getHeight() > 0) { Bitmap bitmap = Bitmap.createBitmap(snapShot.getWidth(), snapShot.getHeight(), Bitmap.Config.ARGB_8888);//设置相应的图片质量 Canvas canvas = new Canvas(bitmap); snapShot.draw(canvas); //将截取的图片保存到本地 try { File appFile = new File(Environment.getExternalStorageDirectory() + "/testpic/app"); if (!appFile.exists() && !appFile.isDirectory()) { appFile.mkdirs(); } String fileName = Environment.getExternalStorageDirectory().getPath() + "/testpic/app/share.jpg"; FileOutputStream fos = new FileOutputStream(fileName); //设置保存本地图片质量 bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos); fos.close(); } catch (Exception e) { UIUtils.setLogInfo("eee", e.getMessage()); } }
2.3截取整个WebView内容
Android 为了提高各方面的绘制速度(如滚动操作),为每一个 View 建立一个缓存,使用 View.buildDrawingCache 为自己的 View 建立相应的缓存, 这个 cache 就是一个 bitmap 对象。利用这个功能可以对整个屏幕视图进行截屏并生成 Bitmap ,也可以获得指定的 View 的 Bitmap 对象。
wv_imgweb.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); wv_imgweb.layout(0, 0, wv_imgweb.getMeasuredWidth(), wv_imgweb.getMeasuredHeight()); wv_imgweb.setDrawingCacheEnabled(true); wv_imgweb.buildDrawingCache(); Bitmap longImage = Bitmap.createBitmap(wv_imgweb.getMeasuredWidth(), wv_imgweb.getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(longImage); // 画布的宽高和 WebView 保持一致 Paint paint = new Paint(); canvas.drawBitmap(longImage, 0, wv_imgweb.getMeasuredHeight(), paint); wv_imgweb.draw(canvas); //将截取的图片保存到本地 try { File appFile = new File(Environment.getExternalStorageDirectory() + "/testpic/app"); if (!appFile.exists() && !appFile.isDirectory()) { appFile.mkdirs(); } String fileName = Environment.getExternalStorageDirectory().getPath() + "/testpic/app/share.jpg"; FileOutputStream fos = new FileOutputStream(fileName); longImage.compress(Bitmap.CompressFormat.JPEG, 70, fos); fos.close(); } catch (Exception e) { UIUtils.setLogInfo("eee", e.getMessage()); }
问题:在5.0+上会发现,截取的快照只显示了webview中显示出来的那部分,没有显示出来的部分是空白的。通过google找到了原因,在5.0+版本上,Android对webview做了优化,旨在减少内存占用以提高性能。因此在默认情况下会智能的绘制html中需要绘制的部分,其实就是当前屏幕展示的html内容,因此会出现未显示的图像是空白的。解决办法是调用enableSlowWholeDocumentDraw()方法。这个方法需要在webview创建之前调用,在Activity里就是在setContentView前去调用,此方法会有显著的性能开销。
3.分享图片
通过原生或第三方分享功能,将上述生成的图片添加到代码中,完成分享。
如果有不同的见解,欢迎留言指正。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android实现截图和分享功能的代码,包括了Android实现截图和分享功能的代码的使用技巧和注意事项,需要的朋友参考一下 先给大家展示下效果图吧 直接上代码: xml的布局: activity的方法: 截取工具: 总结 以上所述是小编给大家介绍的Android实现截图和分享功能的代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊
本文向大家介绍Android实现分享功能,包括了Android实现分享功能的使用技巧和注意事项,需要的朋友参考一下 Android应用中能很方便的完成这些功能,很多的应用中都有“分享”功能?如何分享呢?下面给大家说说看。 最近有人问到Android分享功能用那个比较好,使用Android自带的Intent来进行分享还是借助第三方呢,直接上代码: 一、使用Intent直接和第三方应用进行通信: 看代
本文向大家介绍Android 分享功能的实现,包括了Android 分享功能的实现的使用技巧和注意事项,需要的朋友参考一下 Android 分享功能的实现 Android程序里面的分享功能分为第三方程序分享,就是使用QQ空间,QQ微博,新浪微博,人人等第三方包进行分享; 还有就是用本地程序进行分享,如短信,UC浏览器,蓝牙等. 他们的区别是使用第三方包进行分享手机系统不用安装该类程序,而本地程序
本文向大家介绍Android实现拍照截图功能,包括了Android实现拍照截图功能的使用技巧和注意事项,需要的朋友参考一下 本文将向大家展示如何拍照截图。 先看看效果图: 拍照截图有点儿特殊,要知道,现在的Android智能手机的摄像头都是几百万的像素,拍出来的图片都是非常大的。因此,我们不能像对待相册截图一样使用Bitmap小图,无论大图小图都统一使用Uri进行操作。 一、首先准备好需要使用到的
本文向大家介绍Android实现原生分享功能,包括了Android实现原生分享功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现分享功能的具体代码,供大家参考,具体内容如下 因为公司的需求,最近一直在做分享这一块的功能。大概有这样几种思路: 1.使用Intent调用andoird原生的分享功能; 2.使用第三方的sdk,比如ShareSdk或者友盟; 3.去对应的
本文向大家介绍Android实现合并生成分享图片功能,包括了Android实现合并生成分享图片功能的使用技巧和注意事项,需要的朋友参考一下 有时候分享功能都是很需要分享一个当前屏幕的界面的截图因,以前做校内APP的时候用到过,拿出来分享分享, 用以前写过的自定义课表软件。 Android 自定义View课程表表格 看到的是图片只显示到11节处,下面的没有显示到 所以用到的 ScrollView 因