android开发长截图

当视图超过一个屏幕的时候,可能是listview,也可能是Scrollview,这时候,其实截图就是对listview或者Scrollview进行截图

/**

     * 截取scrollview的屏幕
     * **/
    public static Bitmap getScrollViewBitmap(ScrollView scrollView,String picpath) {
        int h = 0;
        Bitmap bitmap;
        // 获取listView实际高度
        for (int i = 0; i < scrollView.getChildCount(); i++) {
            h += scrollView.getChildAt(i).getHeight();
        }
        Log.d(TAG, "实际高度:" + h);
        Log.d(TAG, " 高度:" + scrollView.getHeight());
        // 创建对应大小的bitmap
        bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
                Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(bitmap);
        scrollView.draw(canvas);
        // 测试输出
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(picpath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            if (null != out) {
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                out.flush();
                out.close();
            }
        } catch (IOException e) {
        }
        return bitmap;
    }


    private static String TAG = "Listview and ScrollView item 截图:";


    /**
     *  截图listview
     * **/
    public static Bitmap getListViewBitmap(ListView listView,String picpath) {
        int h = 0;
        Bitmap bitmap;
        // 获取listView实际高度
        for (int i = 0; i < listView.getChildCount(); i++) {
            h += listView.getChildAt(i).getHeight();
        }
        Log.d(TAG, "实际高度:" + h);
        Log.d(TAG, "list 高度:" + listView.getHeight());
        // 创建对应大小的bitmap
        bitmap = Bitmap.createBitmap(listView.getWidth(), h,
                Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(bitmap);
        listView.draw(canvas);
        // 测试输出
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(picpath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            if (null != out) {
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                out.flush();
                out.close();
            }
        } catch (IOException e) {
        }
        return bitmap;
    }


    // 程序入口 截取ScrollView
    public static void shootScrollView(ScrollView scrollView,String picpath) {
        ScreenShot.savePic(getScrollViewBitmap(scrollView, picpath), picpath);
    }


    // 程序入口 截取ListView
    public static void shootListView(ListView listView,String picpath) {
        ScreenShot.savePic(getListViewBitmap(listView,picpath), picpath);

    }

ListView截屏:ListView是会回收与重用Item,并且只会绘制在屏幕上显示的ItemView,下面的方法采用一个List来存储Item的视图,这种方案依然不够好,当Item足够多的时候,可能会发生oom。

  1. /**  
  2.  * ListView截图  
  3.  *  
  4.  * @param listView 要截图的ListView  
  5.  * @return Bitmap  
  6.  */    
  7. public static Bitmap shotListView(ListView listView) {    
  8.     ListAdapter adapter = listView.getAdapter();    
  9.     int itemsCount = adapter.getCount();    
  10.     int allItemsHeight = 0;    
  11.     
  12.     ArrayList<Bitmap> bmps = new ArrayList<>();    
  13.     for (int i = 0; i < itemsCount; i++) {    
  14.         View childView = adapter.getView(i, null, listView);    
  15.         childView.measure(View.MeasureSpec.makeMeasureSpec(listView.getWidth(),View.MeasureSpec.EXACTLY),    
  16.                 View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED));    
  17.     
  18.         childView.layout(00, childView.getMeasuredWidth(), childView.getMeasuredHeight());    
  19.         childView.setDrawingCacheEnabled(true);    
  20.         childView.buildDrawingCache();    
  21.         bmps.add(childView.getDrawingCache());    
  22.         allItemsHeight += childView.getMeasuredHeight();    
  23.     }    
  24.     
  25.     Bitmap bigBitmap = Bitmap.createBitmap(listView.getMeasuredWidth(), allItemsHeight, Bitmap.Config.ARGB_8888);    
  26.     Canvas bigCanvas = new Canvas(bigBitmap);    
  27.     
  28.     Paint paint = new Paint();    
  29.     int iHeight = 0;    
  30.     
  31.     for (int i = 0; i < bmps.size(); i++) {    
  32.         Bitmap bmp = bmps.get(i);    
  33.         bigCanvas.drawBitmap(bmp, 0, iHeight, paint);    
  34.         iHeight += bmp.getHeight();    
  35.     
  36.         bmp.recycle();    
  37.         bmp = null;    
  38.     }    
  39.     return bigBitmap;    
  40. }    
下载链接https://github.com/wuliuwei/android_screenshots

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值