很多的时候,我们想要分享一个界面的所有内容,可是内容太多,超过了屏幕的大小,简单的截屏已经满足不了我们的需要,这时候我们就可以根据布局里scrollView的高度来截取图片。

代码如下:

[java] view plaincopy
  1. /**
  2. * 截取scrollview的屏幕
  3. * @param scrollView
  4. * @return
  5. */
  6. public static Bitmap getBitmapByView(ScrollView scrollView) {
  7. int h = 0;
  8. Bitmap bitmap = null;
  9. // 获取scrollview实际高度
  10. for (int i = 0; i < scrollView.getChildCount(); i++) {
  11. h += scrollView.getChildAt(i).getHeight();
  12. scrollView.getChildAt(i).setBackgroundColor(
  13. Color.parseColor("#ffffff"));
  14. }
  15. // 创建对应大小的bitmap
  16. bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
  17. Bitmap.Config.RGB_565);
  18. final Canvas canvas = new Canvas(bitmap);
  19. scrollView.draw(canvas);
  20. return bitmap;
  21. }
  22. /**
  23. * 压缩图片
  24. * @param image
  25. * @return
  26. */
  27. public static Bitmap compressImage(Bitmap image) {
  28. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  29. // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
  30. image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
  31. int options = 100;
  32. // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
  33. while (baos.toByteArray().length / 1024 > 100) {
  34. // 重置baos
  35. baos.reset();
  36. // 这里压缩options%,把压缩后的数据存放到baos中
  37. image.compress(Bitmap.CompressFormat.JPEG, options, baos);
  38. // 每次都减少10
  39. options -= 10;
  40. }
  41. // 把压缩后的数据baos存放到ByteArrayInputStream中
  42. ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
  43. // 把ByteArrayInputStream数据生成图片
  44. Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
  45. return bitmap;
  46. }
  47. /**
  48. * 保存到sdcard
  49. * @param b
  50. * @return
  51. */
  52. public static String savePic(Bitmap b) {
  53. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss",
  54. Locale.US);
  55. File outfile = new File("/sdcard/image");
  56. // 如果文件不存在,则创建一个新文件
  57. if (!outfile.isDirectory()) {
  58. try {
  59. outfile.mkdir();
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. }
  63. }
  64. String fname = outfile + "/" + sdf.format(new Date()) + ".png";
  65. FileOutputStream fos = null;
  66. try {
  67. fos = new FileOutputStream(fname);
  68. if (null != fos) {
  69. b.compress(Bitmap.CompressFormat.PNG, 90, fos);
  70. fos.flush();
  71. fos.close();
  72. }
  73. } catch (FileNotFoundException e) {
  74. e.printStackTrace();
  75. } catch (IOException e) {
  76. e.printStackTrace();
  77. }
  78. return fname;
  79. }

在需要用到的地方调用getBitmapByView()方法 即可:

[java] view plaincopy
  1. String fname = ScreenShot.savePic(ScreenShot.getBitmapByView(scrollView));

但是这样写的话有时候会因为截取的图片太长太大而报outofmemory的错,所以为了避免内存溢出,程序崩掉,要注意用Config.RGB_565,会比ARGB_8888少占内存。还有就是把图片压缩一下,至少我这样就没有报oom的错了,即:

[java] view plaincopy
  1. String fname = ScreenShot.savePic(ScreenShot.compressImage(ScreenShot
  2. .getBitmapByView(scrollView)));

Android给scrollView截图超过屏幕大小形成长图相关推荐

  1. 教你怎么图片等比例放大缩小超过屏幕大小

    我就是那个帖子的楼主并且是版主,希望以后和大家多交流,我是南京诚迈公司的,叫廖建国,在ES2部分. 之前看到好多人问一个问题:怎么图片等比例放大或缩小超过屏幕大小,主要是后面超过屏幕大小,我一直没看到 ...

  2. Android Developers:支持不同的屏幕大小

    这节课程向你展示了通过如下方式支持不同的屏幕大小: 确保你的布局能适当地调整大小来适应屏幕 根据屏幕的配置提供适当的UI布局 确保正确的布局被应用到正确的屏幕 提供正确缩放的位图 使用"wr ...

  3. Android针对不同的手机屏幕大小设计图片资源与编码

    一些术语 Screen Size 屏幕尺寸: 实际的物理尺寸,以屏幕的对角线为准(包括通知栏?) 将所有的实际尺寸分为四个广义的尺寸:small(小),normal(正常),large(大),extr ...

  4. Android中如何获取手机屏幕大小

    我们可以通过使用类DisplayMetrics来获取手机屏幕的分辨率大小.DisplayMetrics类是获取手机屏幕各种属性的关键类.下面通过例子来展示如何获取手机屏幕的分辨率. 在布局文件main ...

  5. android大屏适配_Android屏幕大小适配问题解决

    严格来说,作为读者,你应该带着批判性质的眼光来看这篇文章,此文章依据本人对Android官方开发资料<Supporting Multiple Screens>的阅读.实践以及和开发人员的沟 ...

  6. snipaste滚动截图方法_老板让你把整个网页截图形成长图,具体怎么做?

    近几天,我们制作的网页告一段落,老板让发个效果图让他看一下,可是系统自带的printscreen按键只能截当前屏幕,还需要到PS中拼合,用微信.钉钉自带的截图功能也不好用,都要拼合,那么好用的截图软件 ...

  7. android 常用机型尺寸_Android中获取手机屏幕大小的方法

    本文为大家解析Android中如何获取手机屏幕大小,提供一个解决方法,分享给大家供大家参考,具体内容如下 运行效果图: 运行程序后,当我们点击Button按钮时,可以看到下面的效果图: 具体代码: 我 ...

  8. Android 获得手机屏幕大小

    Android在自定义控件时,经常需要获得屏幕的宽高,每次都要写,不妨直接把他封装成工具类,直接拿来用,废话不说,直接上代码 /*** */ package com.example.customvie ...

  9. Android自适应屏幕大小和布局

    一:不同的layout  Android手机屏幕大小不一,有480x320, 640x360, 800x480,854x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下 ...

最新文章

  1. 你太菜了,竟然不知道Code Review...
  2. android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件
  3. jq获取img高度(动态生成的image高度为0原因)
  4. 2021夏季每日一题 【week6 完结】
  5. Python中zip()函数的解释和可视化
  6. tmux多窗口工具基本操作
  7. git 列出标签_Git标签介绍:如何在Git中列出,创建,删除和显示标签
  8. 有木有使用tomcat 7.0 报Out of Memory的同志
  9. Java集合(四) LinkedList详解
  10. java 复写hashcode_java 重写equals()和hashCode()
  11. 很好的一篇讲解sql优化的文章
  12. 计算机专业考研英语二国家线多少分,2020考研国家线:英语二的分数线是多少...
  13. Android四大组件之Service
  14. 2017网易校招:Fibonacci数列
  15. 怎么注册一个docker id
  16. App Tamer for Mac v2.6 应用CPU使用率管理
  17. 2021年初级会计职称《初级会计实务》考试真题
  18. 《蜂鸟摄影学院单反摄影宝典》读书笔记
  19. 宅男福利!爬虫实战,爬取原神真人c图片并保存,谁的老婆快抱走
  20. 创建本地的https证书

热门文章

  1. Best Efforts 1PC 跨库事务
  2. 微软 .NET Core 3.0 版本发布
  3. 米小爱团队负责人王刚:语音交互背后,有多少人工就有多少智能
  4. java短信验证码实现_社交APP开发短信验证是通过什么技术实现
  5. aliyun gradle 代理_gradle:现代高效的java构建工具
  6. 概要设计说明书任务分配
  7. 类中的三个装饰器方法
  8. 【转载】动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...
  9. codeforces 496 E. Distributing Parts(贪心+set二分)
  10. 条款2. 最好使用C++转型操作符