首页 > 系统 > Android > 正文

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

2019-10-22 18:20:20
字体:
来源:转载
供稿:网友

很多的时候,我们想要分享一个界面的所有内容,可是内容太多,超过了屏幕的大小,简单的截屏已经满足不了我们的需要,这时候我们就可以根据布局里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))); 

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表