您的位置:首页 > 移动开发 > Android开发

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

2017-04-14 13:10 537 查看
很多的时候,我们想要分享一个界面的所有内容,可是内容太多,超过了屏幕的大小,简单的截屏已经满足不了我们的需要,这时候我们就可以根据布局里scrollView的高度来截取图片。
代码如下:

[java] view
plain copy

 





/** 

     * 截取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()方法即可:

[java] view
plain copy

 





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

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

[java] view
plain copy

 





String fname = ScreenShot.savePic(ScreenShot.compressImage(ScreenShot  

                        .getBitmapByView(scrollView)));  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: