Android给scrollView截图超过屏幕大小形成长图

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

代码如下:

/**
   * 截取scrollview的屏幕
   * @param scrollView
   * @return
   */
  public static Bitmap getBitmapByView(ScrollView scrollView) {
    int h = 0;
    Bitmap bitmap = null;
    // 获取scrollview实际高度
    for (int i = 0; i < scrollView.getChildCount(); i++) {
      h += scrollView.getChildAt(i).getHeight();
      scrollView.getChildAt(i).setBackgroundColor(
          Color.parseColor("#ffffff"));
    }
    // 创建对应大小的bitmap
    bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
        Bitmap.Config.RGB_565);
    final Canvas canvas = new Canvas(bitmap);
    scrollView.draw(canvas);
    return bitmap;
  } 

  /**
   * 压缩图片
   * @param image
   * @return
   */
  public static Bitmap compressImage(Bitmap image) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    int options = 100;
    // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
    while (baos.toByteArray().length / 1024 > 100) {
      // 重置baos
      baos.reset();
      // 这里压缩options%,把压缩后的数据存放到baos中
      image.compress(Bitmap.CompressFormat.JPEG, options, baos);
      // 每次都减少10
      options -= 10;
    }
    // 把压缩后的数据baos存放到ByteArrayInputStream中
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
    // 把ByteArrayInputStream数据生成图片
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
    return bitmap;
  } 

/**
   * 保存到sdcard
   * @param b
   * @return
   */
  public static String savePic(Bitmap b) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss",
        Locale.US);
    File outfile = new File("/sdcard/image");
    // 如果文件不存在,则创建一个新文件
    if (!outfile.isDirectory()) {
      try {
        outfile.mkdir();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    String fname = outfile + "/" + sdf.format(new Date()) + ".png";
    FileOutputStream fos = null;
    try {
      fos = new FileOutputStream(fname);
      if (null != fos) {
        b.compress(Bitmap.CompressFormat.PNG, 90, fos);
        fos.flush();
        fos.close();
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return fname;
  } 

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

String fname = ScreenShot.savePic(ScreenShot.getBitmapByView(scrollView));

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

String fname = ScreenShot.savePic(ScreenShot.compressImage(ScreenShot
            .getBitmapByView(scrollView))); 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • android开发仿ios的UIScrollView实例代码
  • 详解Android ScrollView嵌套EditText出现的滑动问题
  • android ScrollView实现下拉放大头部图片
  • Android自定义scrollView实现顶部图片下拉放大
  • Android沉浸式状态栏 + actionBar渐变 + scrollView顶部伸缩效果
  • Android开发基于ScrollView实现的渐变导航栏效果示例
  • Android自定义ScrollView使用自定义监听
  • Android开发实现ScrollView中嵌套两个ListView的方法
  • Android开发实现标题随scrollview滑动变色的方法详解
  • Android Webview与ScrollView的滚动兼容及留白处理的方法
  • Android 自定义 HorizontalScrollView 打造多图片OOM 的横向滑动效果(实例代码)
  • Android ScrollView粘性头部代码分享
(0)

相关推荐

  • Android 自定义 HorizontalScrollView 打造多图片OOM 的横向滑动效果(实例代码)

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScrollView可以想ViewPager一样,既可以绑定数据集(动态改变图片),还能做到,不管多少图片都不会OOM(ViewPager内

  • android开发仿ios的UIScrollView实例代码

    今天重新装了编译器,结果崩无极限,真是日了狗了了.刚刚才知道问题在哪边. 好了,说正事,对于ios开发我没接触,不是很了解,百度了半天,差不多就是UIScrollView的把.如果不对,请指证.具体什么效果呢,我刚才拿朋友的iphone手机看了下,iphone的设置界面,第一个列表往下拉可以继续滚,上拉同理.不过android好像没有自带的这种情况. 我把这种效果称为滚无极限的scollview. 下面就来上源码: 首先,最最最重要的就是判断当前视图是否为空,你空视图滚不滚好像没啥区别,除了an

  • Android开发基于ScrollView实现的渐变导航栏效果示例

    本文实例讲述了Android开发基于ScrollView实现的渐变导航栏效果.分享给大家供大家参考,具体如下: 前些日子项目要在原来的页面上加入渐变导航栏的功能,查了很多资料,很多资源都是监听到listview的高度来实现渐变导航栏的效果,可是项目里面很多的界面都是使用ScrollView来实现滑动效果. 实在没办法,就自己写了一个test来实现这个效果. 话不多说,马上看一下思路吧,其实渐变导航栏无非就是改变导航栏的透明度也就是可以设定一个高度,根据这个高度,监听ScrollView滑动的距离

  • Android Webview与ScrollView的滚动兼容及留白处理的方法

    本文介绍了Webview与ScrollView的滚动兼容及留白处理,分享给大家,具体如下: 背景 开发中我们经常会遇到使用网页来显示图文内容,而且往往我们会遇到webview嵌套在scrollview的这种情况,这就开始让人蛋疼了!"为嘛,我的webview加载出来的网页只显示很小一点,其他都不显示了?" "当我重新刷新页面后,为什么webview会出现留白的情况?" ----------------- 天啊,难道就不能好好的吗?! 为了解决项目中这些蛋疼的问题,试

  • Android开发实现标题随scrollview滑动变色的方法详解

    本文实例讲述了Android开发实现标题随scrollview滑动变色的方法.分享给大家供大家参考,具体如下: 要实现某个view的背景透明度跟随scrollview滑动而改变需要重新scrollview的onOverScrolled方法,该方法随着滑动变化(包括手指滑动.手指移开惯性滑动)而响应,所以最适合做变色处理. step1:设定布局 由于我们要实现的是滑动时标题的背景透明度改变,固定顶部的标题view不能在srcollview里面跟随滑动,所以需要这样布局: <FrameLayout

  • Android ScrollView粘性头部代码分享

    前言,一天在点外卖的时候,注意到饿了么列表页的滑动效果不错,但是觉得其中的手势滑动还是挺复杂的,正好又碰到了在熟悉Touch事件的理解当中,所以就抽空对着饿了么的列表页面尝试写写这个效果 1.先贴一个实现的效果图 逻辑是当外部的ScrollView没有滑到底部的时候,往上滑动的时候,是滑动外部的ScrollView,当外部的ScrollView到达底部的时候,我们再网上滑,就是滑动内部的列表了,另外在左右滑动的时候,当左右滑动的距离大于minPageSlop的话,那么就执行左右滑动. 如下是仿饿

  • Android自定义ScrollView使用自定义监听

    本文实例为大家分享了Android使用自定义监听的具体代码,供大家参考,具体内容如下 实现效果:自定义一个ScrollView使用自定义监听,当手指在scrollView滑动滑动的时候做一些事情,我这边简单操作就直接弹出静态吐司显示xy轴的坐标(Toast使用的是静态Toast,源码里面有) 这是在自定义的scrollView设置自定义监听 @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()

  • android ScrollView实现下拉放大头部图片

    前言 之前做项目的时候,需要实现类似微博个人主页的ScrollView效果,就是到顶部时继续下拉会放大顶部的图片.然后在网上找了一篇相关的实现,效果非常好,代码也很简洁易懂.(传送门: 自定义scrollView实现顶部图片下拉放大),那么我这里就只是在其基础上修改了一点点而已,比如在代码中控制图片居中.增加动态设置放大的控件.使用自定义的最大放大倍数等,都是很简单的修改,还添加了滑动的监听回调(项目需要). 效果如下: 思路 老样子,我们先来说下思路,比起代码,思路才是最重要的.具体步骤如下:

  • Android沉浸式状态栏 + actionBar渐变 + scrollView顶部伸缩效果

    闲话不多说,直接上图. 给大家讲讲我的编程思想吧. 第一部分:沉浸式状态栏(API-Level 19, Android4.4 KitKat 之后加入的东西),而且在Api-Level 21版本中新增了一个属性(下面会说到).所以,style文件应该声明三份. values <style name="TranslucentTheme" parent="@style/AppTheme"> </style> values-19 <style

  • 详解Android ScrollView嵌套EditText出现的滑动问题

    今天项目中需求是写出一个很简单的edittext输入框,但要求当输入字数过长时需要上下滑动以便查看所有文字,因为页面底部有一个"确定"的button,但刚开始输入框内的问题怎么都滑动不了,我一开始就想到了这是事件传递冲突问题,但试了很多种方法都不行,最后也是一个一个试才解决的,不多说,贴代码: <ScrollView android:id="@+id/sc_view" android:layout_width="match_parent"

  • Android开发实现ScrollView中嵌套两个ListView的方法

    本文实例讲述了Android开发实现ScrollView中嵌套两个ListView的方法.分享给大家供大家参考,具体如下: 做的项目中要使用两个ListView在同一个页面上下显示,因为数据源不同,不能通过在Adapter中设置标志位去区分显示,最后只能硬着头皮做一个ScrollView嵌套两个ListView,但按正常情况是不能同时显示的,会出现上面的ListView完全显示,下面的只显示一个Item,查了一些资料终于成功了 主要有一个ListViewUtility ,代码如下: import

  • Android自定义scrollView实现顶部图片下拉放大

    本文实例为大家分享了scrollView实现顶部图片下拉放大的具体代码,供大家参考,具体内容如下 之前的scrollView顶部图片下拉放大在之后的项目用到了几次,但没次都写在Activity中很麻烦,也不方便复用.这几天有空,所以重新使用自定义scrollView的方法实现这个效果.原理和之前的基本是一致的,所以也不多说了,直接上代码. package com.example.myapplication.dropzoom; import android.animation.ObjectAnim

随机推荐