1. 程式人生 > >截圖與截長圖功能的實現

截圖與截長圖功能的實現

Demo在GitHub的地址:

https://github.com/Hebin320/ScreenShoot

Demo在CSDN上的下載地址:

http://download.csdn.net/detail/hebin320320/9721970


在Android開發中,有時候會遇到需要截圖分享到朋友圈或者QQ,截圖有擷取當前螢幕,也有需要擷取不僅一個螢幕,可能會很長。

擷取當前螢幕並儲存到記憶體卡的方法:

// 獲取指定Activity的截圖,儲存到png檔案
    public static Bitmap takeScreenShot(Activity activity) {
        // View是你需要截圖的View
View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap b1 = view.getDrawingCache(); // 獲取狀態列高度 Rect frame = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int
statusBarHeight = frame.top; System.out.println(statusBarHeight); // 獲取螢幕長和高 int width = activity.getWindowManager().getDefaultDisplay().getWidth(); int height = activity.getWindowManager().getDefaultDisplay() .getHeight(); // 去掉標題欄 // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight); view.destroyDrawingCache(); return b; } // 儲存到sdcard public static void savePic(Bitmap b, String strFileName) { FileOutputStream fos = null; try { fos = new FileOutputStream(strFileName); if (null != fos) { b.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.flush(); fos.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 程式入口 擷取當前螢幕 public static void shootLoacleView(Activity a,String picpath) { ScreenShot.savePic(ScreenShot.takeScreenShot(a), picpath); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

當檢視超過一個螢幕的時候,可能是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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

截長圖的效果圖:
這裡寫圖片描述